MySQLi查询在Firefox正常运行,Chrome/IE/Edge报错求排查
这个错误mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given本质是你的mysqli_query()执行失败,返回了布尔值false,而非预期的mysqli_result对象。至于Firefox正常、Chrome/Edge报错的差异,浏览器本身不会直接影响服务器端SQL执行,核心问题是不同浏览器下,前端传递的参数或会话状态不一致,导致查询依赖的变量出了问题。
核心原因拆解
你的查询依赖变量$SequenceNo_default指定表名:
$query_ArrayLookup = "SELECT SeqID FROM ".$SequenceNo_default." WHERE SeqActive = 0";
如果在Chrome/Edge中,$SequenceNo_default的值为空、包含特殊字符,或者指向一个不存在的表,就会导致SQL语法错误或表不存在,mysqli_query()就会返回false,后续调用num_rows和mysqli_fetch_assoc()自然报错。
具体排查步骤
打印实际执行的SQL语句
在mysqli_query前添加代码,输出最终生成的SQL:echo $query_ArrayLookup; die(); // 终止程序,查看SQL内容分别在Firefox和Chrome/Edge中刷新页面,对比两者的SQL差异——你会发现Chrome/Edge里的SQL大概率存在表名缺失、格式错误等问题。
检查
$SequenceNo_default的来源
这个变量的取值来源是什么?是前端GET/POST参数?还是Session/Cookie的值?- 如果是前端传参:在Chrome开发者工具的Network面板查看请求参数,确认和Firefox的参数是否一致。
- 如果是会话变量:检查Chrome/Edge的Cookie状态,是否存在会话丢失(比如跨域Cookie设置问题)。
开启MySQL错误提示
在mysqli_query后立即添加错误检查,直接获取MySQL的具体错误信息:$ArrayLookup = mysqli_query($link,$query_ArrayLookup); if (!$ArrayLookup) { die("MySQL执行错误: " . mysqli_error($link)); }刷新Chrome/Edge页面就能看到具体错误,比如
Table 'xxx.yyy' doesn't exist或语法错误,直接定位问题根源。验证数据库连接有效性
虽然Firefox能正常运行,也可以确认$link是有效的数据库连接对象:if (!isset($link) || !$link) { die("数据库连接失败"); }
修复建议
- 对
$SequenceNo_default做合法性校验:因为它是表名,不能用普通转义函数,建议用白名单验证(提前定义允许的表名列表,仅允许列表内的表名使用),或者用反引号包裹表名避免特殊字符导致的语法错误:// 用反引号包裹表名,规避特殊字符问题 $query_ArrayLookup = "SELECT SeqID FROM `".$SequenceNo_default."` WHERE SeqActive = 0"; - 养成SQL执行后检查结果的习惯:不要默认查询一定成功,始终处理
mysqli_query()返回false的异常情况。
内容的提问来源于stack exchange,提问作者DCJones

