检查用户名和密码是否正确

3

目前我的代码总是输出echo "用户名/密码不正确。";无论用户名/密码是否匹配。我的问题是,下面的php代码有什么问题,导致它总是输出"用户名/密码不正确"。

<?php
require 'privstuff/dbinfo.php';

$password1 = $_POST["password1"];
$username = $_POST["username"];

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);


if(mysqli_connect_errno()) {
    echo "Connection Failed. Please send an email to owner@othertxt.com regarding this problem.";
    exit();
}

if ($stmt = $mysqli->prepare("SELECT username, password FROM accounts WHERE username=? and password=?")) {

    $db_pw = password_hash($password1, PASSWORD_BCRYPT);

    $stmt->bind_param("ss", $username, $db_pw);
    $stmt->execute();
    if ($stmt->affected_rows > 0) {

        echo "Logged in.";
    }else{
        echo "Username/Password incorrect.";
    }
    $stmt->close();
}
$stmt->close();

$mysqli->close(); 

?>

更新我已将 if ($stmt->affected_rows > 0)更改为 if ($stmt->num_rows)。但仍然不起作用。 更新2我意识到问题出在我使用了 password_hash($password1, PASSWORD_BCRYPT); 我没有意识到哈希每次都会生成不同的字符串。我不明白如何使用password_verify。


你有什么问题? - Charlotte Dunois
你试过使用$stmt->num_rows而不是$stmt->affected_rows吗? - Charlotte Dunois
是的,我有@CharlotteDunois。 - DanMossa
如果你倾倒 $stmt var_dump($stmt);,你会得到什么? - Charlotte Dunois
当您获取用户信息时,为什么不直接进行检查呢?此外,对于“select”语句,您不能依赖“受影响的行数”和“行数”值,因为某些驱动程序在开始提取它们之前不会更新它们。它们中没有一个会更新“总计”计数,因为它们必须读取所有返回的行才能提供准确的计数。 - Ryan Vincent
超级愚蠢的问题,我不确定你的意思是什么。 - DanMossa
2个回答

4

刚查了一下,对于 SELECT 语句,affected_rows 的工作方式与 num_rows 相同。 - Charlotte Dunois
1
根据文档的说法:此函数仅适用于更新表的查询。要获取SELECT查询的行数,请使用mysqli_stmt_num_rows()函数。 - Barmar
OP应该使用PDO,而不是mysqli - Alnitak
@Alnitak:我更喜欢PDO,但MySQLi不行吗? - halfer
1
@Alnitak 为什么?mysql已经被弃用,而mysqli没有。 - Barmar
显示剩余5条评论

0

我解决了。我不应该再次使用password_hash。我没有意识到使用password_hash会产生不同的结果。然后我改用了password_verify。

<?php
require 'privstuff/dbinfo.php';


$username = $_POST["username"];
$password1 = $_POST["password1"];

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);

// Check connection
if(mysqli_connect_errno()) {
    echo "Connection Failed: " . mysqli_connect_errno();
    exit();
}

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT `password` FROM `accounts` WHERE username = ?")) {

    /* Bind parameters: s - string, b - blob, i - int, etc */
    $stmt -> bind_param("s", $username);

    /* Execute it */
    $stmt -> execute();

    /* Bind results */
    $stmt -> bind_result($result);

    /* Fetch the value */
    $stmt -> fetch();

    /* Close statement */
    $stmt -> close();
}


if(password_verify($password1, $result))
{
    echo("Hello");
}else{
    echo("No-Go");
}

$mysqli->close(); 
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接