为何mysqli_stmt_num_rows函数返回0?登录页面预编译语句问题排查
排查预编译语句导致登录查询结果为0的问题
我之前做登录功能时也踩过预编译语句的坑,结合你描述的情况——数据库明明存在test@test.com但$resultCheck返回0,大概率是预编译语句的执行流程或者参数处理出了问题,咱们一步步来排查:
1. 检查参数绑定的类型是否正确
这是最常见的错误!比如在MySQLi中,如果你把邮箱(字符串类型)用整数类型"i"绑定,数据库会把字符串转成0去匹配,自然找不到结果。
- 正确的绑定应该用字符串类型标识符
"s",比如:mysqli_stmt_bind_param($stmt, "s", $email); - 如果是PDO的话,不需要指定类型,但也要确保传入的参数是正确的字符串格式。
2. 确认预编译语句的执行流程完整
很多人会漏掉execute()步骤,导致查询根本没有发送到数据库:
- MySQLi流程:
prepare()→bind_param()→execute()→store_result()→num_rows - PDO流程:
prepare()→execute([$param])→rowCount()
如果跳过了execute(),结果集行数必然是0。
3. 检查结果集的获取方式
在MySQLi中,如果你直接用mysqli_stmt_num_rows($stmt)而没有先调用mysqli_stmt_store_result($stmt),可能会得到错误的行数(因为结果集还没从数据库拉取到本地)。
一定要先执行mysqli_stmt_store_result($stmt),再去获取行数。
4. 排查数据匹配的隐性问题
有时候不是预编译的锅,是数据本身的问题:
- 隐形空格:数据库里的邮箱可能带前后空格(比如
test@test.com),而你输入的是无空格的版本。可以在处理输入时先做trim($email)。 - 大小写敏感:如果数据库表的collation是
utf8_bin这类大小写敏感的规则,Test@Test.com和test@test.com会被视为不同值。可以改成utf8mb4_general_ci(不区分大小写),或者查询时统一转成小写:SELECT * FROM users WHERE LOWER(email) = LOWER(?)
5. 检查SQL语句的逻辑错误
比如:
- 字段名写错了:数据库里是
user_email,你SQL里写的是email - 多条件绑定遗漏:比如SQL是
WHERE email = ? AND password = ?,但你只绑定了邮箱参数,没绑定密码,导致条件不匹配
附一个正确的MySQLi登录示例
// 开启错误提示,方便排查 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 假设已建立数据库连接$conn $email = trim($_POST['email']); $password = $_POST['password']; // 准备查询语句 $sql = "SELECT id, email, password_hash FROM users WHERE email = ?"; $stmt = mysqli_prepare($conn, $sql); // 绑定参数 mysqli_stmt_bind_param($stmt, "s", $email); // 执行语句 mysqli_stmt_execute($stmt); // 存储结果集 mysqli_stmt_store_result($stmt); // 获取匹配行数 $resultCheck = mysqli_stmt_num_rows($stmt); if ($resultCheck > 0) { // 绑定结果到变量 mysqli_stmt_bind_result($stmt, $id, $dbEmail, $dbPwdHash); mysqli_stmt_fetch($stmt); // 验证密码(必须用password_verify,不要直接对比明文) if (password_verify($password, $dbPwdHash)) { // 登录成功,处理会话等逻辑 session_start(); $_SESSION['user_id'] = $id; header("Location: dashboard.php"); exit(); } else { echo "密码错误"; } } else { echo "未找到该邮箱对应的用户"; } // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn);
内容的提问来源于stack exchange,提问作者Jordan Baron
相关产品推荐
相关产品推荐

