不知道这是怎么回事,但是我的password_verify语句返回的是未定义的偏移量。在数据库密码中,必填字段是必填字段,不能为空,在尝试针对哈希验证密码之前,我已经验证了至少返回了1个匹配行。当我在此语句之前使用foreach循环并检查结果变量时,它为我提供了很好的哈希密码,因此我知道数组中至少有1个值。但是,当我尝试访问$ result [0]时,由于某种原因会抛出未定义的偏移量。尝试查找此内容,但除了错误以外找不到其他相关信息,只是说明数组索引无效,这又是不可能的,因为我可以使用foreach检查结果变量并在其中查看哈希密码。
我还有第二个问题,因为我仍在学习PDO,当我从提取请求中删除PDO :: FETCH_ASSOC时,我的结果变量中得到了重复的条目。为什么会这样?
Login.php
<?php
require "conn.php";
$email = $_POST['email'];
$email = strtolower($email);
$pass = $_POST['password'];
$stmt = $pdo->prepare("SELECT password FROM account WHERE email=:email");
$stmt->bindParam(":email", $email);
$stmt->execute();
$count = $stmt->rowCount(); // gets count of records found
if($count > 0) {
$result = $stmt->fetch(PDO::FETCH_ASSOC); // gets resultset
if(!password_verify($pass, $result[0])) {
echo "2";
} else
echo "0";
}
else {
echo "1";
}
?>
答案 0 :(得分:1)
这将节省您几毫秒的时间,但是,您应该先获取数据,然后在没有附加条件语句的情况下测试结果。由于您使用的是PDO::FETCH_ASSOC
,因此应使用列名作为标识符,而不是索引:
<?php
require "conn.php";
$email = $_POST['email'];
$email = strtolower($email);
$pass = $_POST['password'];
$stmt = $pdo->prepare("SELECT password FROM account WHERE email=:email");
$stmt->bindParam(":email", $email);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC); // just fetch
if(!password_verify($pass, $result['password'])) { // note, column name as identifier, if the password is bad or the column is empty the test is valid
echo "2";
} else {
echo "0";
}
?>
此外,password_hash()
需要一列至少60个字符的宽度。小于此值将导致测试失败。