我有一个旧版本的PHP,这是5.4.16,我从github下载了 password.php
这使得password_hash()完美无缺.我也将它插入数据库但是当我尝试使用password_verify()时,我得到了无效.我只想在数据库中提取一行数据,以便为自己创建一些可以登录的内容.
我的数据库是(数据库工作正常,因为在我尝试添加登录之前,我有一个列表,从同一个数据库中提取数据只是不同的表并且工作正常)
$db = new PDO('mysql:dbname=database;host=hostip', 'root', 'password');
Run Code Online (Sandbox Code Playgroud)
我在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
));
Run Code Online (Sandbox Code Playgroud)
尝试验证我这样做了
/* 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';
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的是无效的.我无法弄清楚我做错了什么.我在查询错了吗?
PS如果我运行插入几次,数据库中的哈希密码每次都不同,即使密码总是'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';
}
Run Code Online (Sandbox Code Playgroud)
小智 5
$ selectQuery变量是一个PDOStatement对象,在这种情况下,这就是你对变量行的贡献.而是将$ selectQuery切换到$ selectQuery-> fetchAll().
$rows = $selectQuery->rowCount() ? $selectQuery : array();
Run Code Online (Sandbox Code Playgroud)
应该
$rows = $selectQuery->rowCount() ? $selectQuery->fetchAll() : array();
Run Code Online (Sandbox Code Playgroud)