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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:42