Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO登录系统故障_Php_Mysql_Pdo - Fatal编程技术网

PHP PDO登录系统故障

PHP PDO登录系统故障,php,mysql,pdo,Php,Mysql,Pdo,我正在做一个登录系统,但似乎任何拥有任何密码的用户都可以进入我的系统 我可以使用mysqli制作这个系统,但是我在PDO上遇到了问题。我该如何解决它 if(isset($_POST["login-submit"])){ require "dbh.inc.php"; $username = $_POST["username"]; $user_password = $_POST["password"]; $user_password = password_hash($

我正在做一个登录系统,但似乎任何拥有任何密码的用户都可以进入我的系统

我可以使用mysqli制作这个系统,但是我在PDO上遇到了问题。我该如何解决它

if(isset($_POST["login-submit"])){
    require "dbh.inc.php";
    $username = $_POST["username"];
    $user_password = $_POST["password"];
    $user_password = password_hash($user_password, PASSWORD_DEFAULT);

    $sql = "SELECT count(id) FROM users WHERE username = :username AND user_password = :user_password"; 
    $stmt = $conn->prepare($sql);
    $stmt->execute(["username" => $username, "user_password" => $user_password]);
    if($stmt->rowCount() == 1){
        session_start();
        $_SESSION["username"] =  $username;
        header("location:../index.php?login=success");
        exit();
    } else {
        header("location:../index.php?login=failed");
        exit();
    }
}
我已经测试了代码的所有其他部分,当我注册一个新用户时,它们似乎工作得很好,但如果我使用登录表单,任何人只要有任何密码都可以进入我的系统。它总是显示登录成功,即使我输入了一个错误的用户与wron密码。 我也看到过其他关于堆栈溢出的类似问题,但这些代码有点复杂。

rowCount()
不用于SELECT语句:

PDOStatement::rowCount()返回受相应PDOStatement对象执行的最后一个DELETE、INSERT或UPDATE语句影响的行数

如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为

您需要检索和检查查询执行的实际结果,而不仅仅是检查执行时发生的情况。

(假设您的数据库是从SELECT返回行数的数据库之一)


聚合sql将始终(至少)返回一行,因为
计数可以是0。假设id是唯一的主键,则无需再次对密码进行哈希运算以检查密码的有效性,而应使用
password\u verify
检查密码是否合法

if(isset($_POST["login-submit"])){
    require "dbh.inc.php";
    $username = $_POST["username"];
    $user_password = $_POST["password"];

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $stmt = $conn->prepare($sql);
    $stmt->execute(["username" => $username]);
    $user = $stmt->fetch();
    $hash = $user['user_password'];
    if(password_verify($user_password,$hash)){
        session_start();
        $_SESSION["username"] =  $username;
        header("location:../index.php?login=success");
        exit();
    } else {
        header("location:../index.php?login=failed");
        exit();
    }
}
假设您使用
password\u hash
函数将用户密码保存在数据库中。
另外,在使用用户名获取后,获取散列,然后使用
password\u verify()
function,

验证它。那么会发生什么呢?你得到login=failed的标题了吗?我刚刚更新了问题,请在提出任何问题之前进行研究,因此,请看我已经看到了该页面,相信我,当我去那里阅读内容时,它看起来像中文。查看此密码\u散列(string$password,int$algo[,array$options]):string我从未见过这样的数组。我是PHP新手。请您编写实际代码并编辑上面的代码。这不是问题中的唯一问题