You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:46:52