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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:35:16