mysqli中while($stmt->fetch())之后代码无法执行的问题求助
解决PHP mysqli中
while ($stmt->fetch())后代码不执行的问题 嘿,我一眼就发现你代码里的核心问题了——bind_result()的调用顺序完全搞反了!这也是mysqli预处理语句新手常踩的典型坑。
问题根源
mysqli_stmt的正确执行流程是固定的:
prepare()准备SQL语句bind_param()绑定查询参数execute()执行查询bind_result()绑定结果集到变量fetch()遍历获取每一行结果
你的代码里把bind_result()放到了fetch()的循环内部,这时候fetch()已经尝试读取结果,但根本没有变量来接收结果,自然不会进入循环,后续代码也就完全卡在这里不执行了。
另外还有个潜在隐患:你用"i"(整数类型)绑定$param_username,但username字段通常是字符串类型,这会导致参数绑定类型不匹配,查询根本得不到有效结果,也会让fetch()循环直接跳过。
修正后的代码
if (isset($_POST['join'])) { $selectedgame = $_POST['join']; $stmt = $link->prepare("SELECT tournaments FROM users WHERE username = ?"); // 注意:username是字符串,这里用"s"类型绑定 $stmt->bind_param("s", $param_username); if($stmt->execute()) { // 关键:先绑定结果变量,再调用fetch $stmt->bind_result($usertournaments); while ($stmt->fetch()) { // 现在这里可以正常执行了 if ($usertournaments == 0) { // 你的后续业务逻辑代码 } } // 记得用完关闭语句 $stmt->close(); } else { // 可以在这里捕获执行阶段的错误 echo "执行错误: " . $stmt->error; } }
额外排查技巧
- 先确认
$param_username是否被正确赋值,比如用var_dump($param_username)输出看看内容是否符合预期 - 如果想确认查询是否返回了结果,可以在
execute()后调用$stmt->store_result(),然后用$stmt->num_rows查看返回行数:$stmt->execute(); $stmt->store_result(); echo "匹配到的记录数: " . $stmt->num_rows; // 如果是0说明没有符合条件的记录 $stmt->bind_result($usertournaments);
内容的提问来源于stack exchange,提问作者user8270731
相关产品推荐
相关产品推荐

