PHP登录功能无法正常运行,密码验证判断异常求助
问题排查与解决方案
我来帮你梳理下代码里的问题,这几个点应该就是导致count == 1不生效的核心原因:
1. 函数调用参数不匹配
你调用test_input($conn,$database,$_POST["passord"])时传了3个参数,但函数定义function test_input($data)只接受1个参数!这会导致函数处理的是$conn(数据库连接对象)而不是用户输入的密码,自然查不到匹配的结果。
修正:
把调用改成:
$passord = test_input($_POST["passord"]);
2. mysqli_query 参数错误
mysqli_query($conn,$database,$sql)是错误的用法,mysqli_query的第二个参数是SQL语句,不需要传数据库名(你应该已经通过mysqli_select_db或连接时指定了数据库)。多传的$database会导致查询失败,$result返回false,此时mysqli_num_rows(false)会返回0,所以count == 1永远不成立。
修正:
改成正确的调用方式:
$result = mysqli_query($conn, $sql);
3. 未处理查询失败的情况
如果查询出错(比如参数错误),$result会是false,直接调用mysqli_num_rows会报错,建议先检查查询是否成功:
$result = mysqli_query($conn, $sql); if (!$result) { // 输出错误信息方便调试,上线后可注释 echo '<script>console.log("Query error: ' . mysqli_error($conn) . '");</script>'; exit; } $count = mysqli_num_rows($result);
4. 严重的SQL注入风险
直接把用户输入拼接进SQL语句是非常危险的,容易被SQL注入攻击,建议使用预处理语句替代:
// 用预处理语句查询 $stmt = mysqli_prepare($conn, "SELECT id FROM passwords WHERE passord = ?"); // 绑定参数,"s"表示字符串类型 mysqli_stmt_bind_param($stmt, "s", $passord); mysqli_stmt_execute($stmt); // 存储结果以便获取行数 mysqli_stmt_store_result($stmt); $count = mysqli_stmt_num_rows($stmt);
5. 跳转后未终止脚本执行
使用header跳转后,一定要加上exit或die,否则后续代码可能继续执行,导致意外的结果:
if($count == 1) { header("location: stemmegivning.php"); exit; // 终止脚本,避免后续代码运行 }
额外提醒:密码存储的最佳实践
如果你的数据库里存储的是哈希后的密码(这是正确的做法,永远不要存明文密码),那直接用passord = '$passord'对比是永远匹配不到的,应该用password_verify函数验证:
// 查询数据库中的哈希密码 $stmt = mysqli_prepare($conn, "SELECT passord FROM passwords WHERE id = ?"); // 根据你的查询条件调整 mysqli_stmt_bind_param($stmt, "s", $someIdentifier); // 比如用户ID或其他标识 mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $hashedPassword); mysqli_stmt_fetch($stmt); // 验证密码 if (password_verify($passord, $hashedPassword)) { header("location: stemmegivning.php"); exit; } else { echo '<script type="text/javascript">wrongPw ()</script>'; }
修正后的完整示例代码
<?php $database = "passwords"; if ($_SERVER["REQUEST_METHOD"] == "POST") { $passord = test_input($_POST["passord"]); // 使用预处理语句避免SQL注入 $stmt = mysqli_prepare($conn, "SELECT id FROM passwords WHERE passord = ?"); mysqli_stmt_bind_param($stmt, "s", $passord); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); $count = mysqli_stmt_num_rows($stmt); echo('<script>console.log("connected successfully");</script>'); if($count == 1) { header("location: stemmegivning.php"); exit; } else { echo '<script type="text/javascript">wrongPw ()</script>'; } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
内容的提问来源于stack exchange,提问作者Trympet
相关产品推荐
相关产品推荐

