数据库中的行数 - 准备好的语句 - php

时间:2016-11-10 18:17:17

标签: php mysqli

我似乎无法弄清楚如何使用我的查询从数据库中检索行数,每当我运行查询它只返回零,即使它在我的数据库中

$username = $_POST['username'];
$hash = password_verify($password, $passwordcheck);

if($stmt = $conn -> prepare("SELECT username, email, password FROM users WHERE (username = ? OR email = ?) AND password = ?"))
{

    $stmt -> bind_param("sss", $username, $username, $hash);
    $stmt -> execute();

    $stmt -> bind_result($checkedUsername, $checkedEmail, $checkedPassword);

    $stmt -> fetch();
    $numberofrows = $stmt->num_rows;

    $stmt -> close();
}
echo '# rows: '.$numberofrows;

任何人都可以给我任何提示吗?看不到要把它包裹起来,谢谢。

顺便说一句,在此声明之前已经查询过$ hash。

2 个答案:

答案 0 :(得分:0)

将此信息发布为社区维基:

$stmt->store_result();

之后添加execute()

答案 1 :(得分:0)

我假设您在存储在数据库中的密码上使用了password_hash()。那么你不应该在搜索条件中使用它。重新散列相同的字符串不会使用password_hash()生成相同的散列,因为每次运行时它将使用不同的SALT,这就是为什么它是推荐的散列工具。

所以你需要做这样的事情

$username = $_POST['username'];

$stmt = $conn->prepare("SELECT username, email, password 
                        FROM users WHERE (username = ? OR email = ?)") 
if($stmt) {

    $stmt->bind_param("ss", $username, $username);
    $stmt->execute();

    // As per @fred-ii- comment
    $stmt->store_result();

    $stmt->bind_result($checkedUsername, $checkedEmail, $checkedPassword);

    $stmt->fetch();

    echo '# rows: ' . $stmt->num_rows;

    if ( password_verify($_POST['password'], $checkedPassword) ) {
        // password is correct
    } else {
        // password is NOT correct
    }

    $stmt -> close();
}