Prepared Statement存在匹配数据却不返回行的问题求助
解决Prepared Statement返回num_rows为0的问题
嘿,这问题我碰到过好多次了!你的代码里有两个关键的小疏漏,直接导致预处理语句没拿到正确结果:
第一个问题:绑定的变量没赋值
你在bind_param里用了$userName和$userPass,但代码里根本没给这两个变量设置对应的值啊!默认它们是空字符串,相当于你在执行userName = "" AND userPass = ""的查询,当然匹配不到数据库里的test/data记录。
第二个问题:没存储结果集
mysqli的Prepared Statement执行完execute()后,结果集还留在数据库服务器端,没拉到PHP本地内存里,这时候num_rows自然返回0。必须调用store_result()把结果集拉到本地,才能正确统计行数。
修正后的完整代码
// 初始化数据库连接 $query = new mysqli('localhost','root', '', 'sample'); // 先给绑定变量赋值,对应你要查询的目标值 $userName = "test"; $userPass = "data"; // 预处理SQL语句 $prepared = $query->prepare('SELECT * FROM `sample`.`sample_user` WHERE `userName` = ? AND `userPass` = ?'); if (!$prepared) { die("预处理失败:" . $query->error); } // 绑定参数 $bindSuccess = $prepared->bind_param("ss", $userName, $userPass ); if (!$bindSuccess) { die("参数绑定失败:" . $prepared->error); } // 执行预处理语句 $executeSuccess = $prepared->execute(); if (!$executeSuccess) { die("执行失败:" . $prepared->error); } // 关键步骤:将结果集拉取到本地内存 $prepared->store_result(); // 现在就能拿到正确的行数了 echo $prepared->num_rows; // 应该返回1
额外小技巧
如果你之后还要读取具体的记录,也可以用get_result()直接拿到结果集对象,用法和普通query返回的结果完全一致:
$prepared->execute(); $result = $prepared->get_result(); echo $result->num_rows; // 同样能得到1 // 读取单条记录 $row = $result->fetch_assoc();
另外加上错误检查能帮你快速排查其他隐性问题,比如SQL语法错误、数据库权限问题之类的,避免踩更多不必要的坑。
内容的提问来源于stack exchange,提问作者Ricardo Raz
相关产品推荐
相关产品推荐

