密码验证与php版本5.4.16无效

时间:2014-09-07 01:32:13

标签: php mysql

我确实有一个早期版本的php,这是5.4.16,我下载了 password.php from github

这使得password_hash()完美地运行。我也将它插入数据库但是当我尝试使用password_verify()时,我得到了无效。 我只想在数据库中提取一行数据,以便为自己创建一些东西 登录。

我的数据库是(数据库工作正常,因为在我尝试添加登录之前,我有一个列表,它从同一个数据库中提取数据只是在不同的表中工作正常)

$db = new PDO('mysql:dbname=database;host=hostip', 'root', 'password'); 

我在php中创建了这个,在我的表中插入一行

/*Inserts*/

$password = password_hash('asdf', PASSWORD_BCRYPT, array('cost' => 10));
$username = 'admin';

$insertQuery = $db->prepare("
        INSERT INTO et_todo (username, password)
        VALUES (:username, :password)
    ");

$insertQuery->execute(array(
        'username' => $username,
        'password' => $password
    ));

尝试验证我做了这个

/* Selects */

$selectQuery = $db->prepare("
        SELECT id, username, password
        FROM et_todo
        WHERE id = :id
    ");

$selectQuery->execute(array(
        'id' => 9  //should be 1 but 9 because I tried few testings 
    ));

$rows = $selectQuery->rowCount() ? $selectQuery : array();

foreach ($rows as $row)
{
        if (password_verify('asdf', $row['password'])) {
        /* Valid */
        echo 'valid';
    } else {
        /* Invalid */
        echo 'invalid';
    }
}

我得到的是无效的。我无法弄清楚我做错了什么。 我的查询错了吗?

P.S。 如果我运行插入几次,数据库中的哈希密码每次都不同,即使密码总是'asdf'(如下所述是正常但只是尽量提供尽可能多的信息)


将$ selectQuery更改为$ selectQuery-> fetchAll(PDO :: FETCH_ASSOC)所以我取出了foreach循环和代码,如下所示但仍然无效而不是有效但

$rows = $selectQuery->rowCount() ? $selectQuery->fetchAll(PDO::FETCH_ASSOC) : array();

echo $rows[0]['password'] . '<br>';

if (password_verify('asdf', $rows[0]['password'])) {
    /* Valid */
    echo 'valid';
} else {
    /* Invalid */
    echo 'invalid';
}

2 个答案:

答案 0 :(得分:5)

$ selectQuery变量是一个PDOStatement对象,在这种情况下,这就是你对变量行的贡献。而是将$ selectQuery切换到$ selectQuery-&gt; fetchAll()。

$rows = $selectQuery->rowCount() ? $selectQuery : array();

应该是

$rows = $selectQuery->rowCount() ? $selectQuery->fetchAll() : array();

答案 1 :(得分:2)

PHP - password_verify issue

我终于在这个帖子中找到了答案。 在我的数据库中,我有密码的varchar50,我认为它足够好并使用strlen来检查已经在数据库中的密码的长度,并且它的长度为50。 之后我改为varchar255并运行另一个插入并检查新插入的最新长度,长度为60! 然后我重新运行脚本并最终获得有效!!