MySQL列含连字符导致mysqli_fetch_array无法正确获取值
解决MySQL列名含连字符时PHP mysqli_fetch_array无法取值的问题
哦,这个坑我之前踩过好几次!问题出在PHP对数组键名的解析逻辑上——当你的列名是pass-fail这种带连字符的,直接写$row['pass-fail']的时候,PHP会误把中间的减号当成减法运算符,把它解析成$row['pass'] - fail(这里fail会被当作未定义的常量,最终解析成字符串'fail',结果自然不对)。
给你几个靠谱的解决方案,按推荐程度排序:
1. 在SQL查询中给列加别名(最推荐)
直接在查询语句里把带连字符的列名改成下划线风格的别名,从根源上避免问题:
SELECT `pass-fail` AS pass_fail, serial_number, other_columns FROM your_table WHERE your_condition;
之后在PHP里直接用别名访问,完全不用纠结特殊字符:
$pass_fail = $row['pass_fail'];
这种方式不仅解决当前问题,后续维护代码也更清爽,毕竟下划线是PHP变量/数组键的常规命名方式。
2. 使用花括号语法访问数组键
如果不想改SQL,那就用PHP的花括号语法明确指定完整的键名,让PHP知道这是一个整体:
// 两种写法都可以 $pass_fail = $row{"pass-fail"}; // 或者 $pass_fail = $row['pass-fail'];
注意:如果是在双引号字符串里输出,一定要用花括号包裹,比如:
echo "测试结果:{$row['pass-fail']}"; // 或者 echo "测试结果:{$row["pass-fail"]}";
千万别直接写"$row[pass-fail]",不然又会被解析成减法运算。
3. 使用索引数组访问
既然你说序列号(应该是索引下标)能正常获取,那也可以直接用列的索引位置来取值。比如pass-fail是结果集中的第2列(从0开始计数的话是1),那可以写:
$pass_fail = $row[1];
不过这种方式不推荐,因为如果后续SQL调整了列的顺序,代码就会出错,维护性很差。
最后再检查下你的代码有没有犯这些低级错误:
- 是不是没给键名加引号?比如写了
$row[pass-fail](没引号的话PHP会把pass和fail当成常量) - 是不是用了双引号字符串但没加花括号?比如
echo "$row[pass-fail]";
内容的提问来源于stack exchange,提问作者user3470332
相关产品推荐
相关产品推荐

