PHP MySQL预处理语句按字符串匹配查询无结果问题排查
问题根因
预处理语句查询无结果的核心原因是缺失结果行抓取步骤:
bind_result()仅完成返回列和PHP变量的绑定关系注册,不会主动把查询到的值写入绑定变量store_result()的作用是将数据库端的结果集全量拉取到PHP本地内存缓存,同样不会触发单行数据的读取赋值
你之前用预处理做插入操作不需要读取返回结果,少一步抓取不会触发问题;而拼接SQL的代码中调用了fetch_assoc()完成了行数据读取,所以可以正常拿到返回值。
修复后的正确代码
在store_result()之后调用fetch()方法,即可将查询到的行数据写入绑定的$student_number变量:
$student_name = "Student, Sample"; $student_number = ""; $SQLStmt = $db->prepare( "SELECT student_number FROM `table` WHERE `name` = ?" ); $SQLStmt->bind_param( "s", $student_name ); $SQLStmt->execute(); $SQLStmt->store_result(); $SQLStmt->bind_result( $student_number ); // 抓取结果行,这一步才会把查询到的值写入绑定变量 $SQLStmt->fetch(); echo $student_number; $SQLStmt->free_result(); // 操作完成后释放结果集,减少内存占用
补充排查思路
如果加上fetch()后依然无法拿到结果,可按以下顺序排查:
- 开启mysqli错误报告:在数据库连接初始化代码后添加
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,强制所有数据库错误以异常形式抛出,避免静默失败难以定位 - 校验匹配行数:调用
store_result()后打印$SQLStmt->num_rows,如果值为0说明查询条件没有匹配到数据,优先检查预处理语句使用的数据库连接、字符集是否和拼接SQL的连接一致——字符集不匹配时,带特殊字符的字段值会出现隐式编码转换,导致等值匹配失效 - 调整绑定顺序:确保
bind_result()在execute()方法调用之后执行,部分低版本PHP环境下提前绑定结果列会出现绑定失效问题
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

