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

登录验证异常:输入正确账号密码,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:51