登录验证异常:输入正确账号密码,mysqli_num_rows返回0
解决登录验证返回0的问题
我来帮你排查这个登录验证的问题——明明输入了数据库里存在的账号密码,却还是返回0,大概率是这几个原因导致的,咱们一步步来解决:
1. 密码匹配逻辑错误
首先要确认数据库里的password字段是明文存储吗?如果你的数据库里存的是加密后的密码(比如用md5()、password_hash()加密过),但代码里直接用输入的明文密码去对比,肯定匹配不上。
- 比如数据库里存的是
password_hash('123456', PASSWORD_DEFAULT)生成的字符串,那你必须用password_verify($password, $db_password)来验证,而不是直接相等对比。 - 先去phpMyAdmin里查看
users表的password字段值,和你输入的密码是否完全一致(包括大小写、有没有隐形空格)。
2. SQL注入风险&字符串转义问题
你现在的代码直接把POST参数拼进SQL语句里,不仅有严重的SQL注入风险,还可能因为输入内容包含特殊字符(比如单引号'、反斜杠)导致SQL语法错误,最终返回空结果。
比如用户名为O'Neil时,生成的SQL会变成:
SELECT id FROM users WHERE login='O'Neil' AND password='xxx'
这明显语法错误,自然查不到数据。解决办法是使用MySQLi预处理语句,它能自动处理参数转义,同时避免注入:
修正后的PHP代码(预处理版本)
<?php // 先去除输入内容的前后空格,避免隐形空格导致匹配失败 $login = trim($_POST['login']); $password = trim($_POST['password']); require "config/con1.php"; // 使用预处理语句,?是参数占位符 $sql = "SELECT id FROM users WHERE login = ? AND password = ?"; $stmt = mysqli_prepare($con, $sql); // 绑定参数:"ss"表示两个字符串类型的参数 mysqli_stmt_bind_param($stmt, "ss", $login, $password); // 执行查询 mysqli_stmt_execute($stmt); // 存储结果到内存,方便获取行数 mysqli_stmt_store_result($stmt); // 获取匹配的行数 $value = mysqli_stmt_num_rows($stmt); echo $value; // 关闭资源 mysqli_stmt_close($stmt); mysqli_close($con); ?>
3. 隐形空格或字符编码问题
- 输入框可能会被用户不小心输入前后空格,所以在PHP里一定要用
trim()处理输入内容,就像上面代码里那样。 - 检查数据库的字符编码(比如
users表的编码是否为UTF-8)和页面的编码是否一致,避免中文、特殊字符乱码导致匹配失败。
4. 调试SQL语句
如果还是不行,你可以先把生成的SQL语句打印出来,复制到phpMyAdmin里执行,看能不能查到结果:
// 在执行查询前添加这句,打印生成的SQL echo $sql;
如果在phpMyAdmin里能查到结果,但代码里不行,那就是参数传递或者转义的问题,用预处理语句基本就能解决。
前端小问题提醒
你的login.html里密码输入框的标签没闭合:
<input type="password" id="pass" placeholder="Password" <br>
改成下面这样更规范:
<input type="password" id="pass" placeholder="Password"><br>
内容的提问来源于stack exchange,提问作者unknown programmer
相关产品推荐
相关产品推荐

