【发布时间】:2018-08-27 17:54:21
【问题描述】:
不确定这里发生了什么,但我的 password_verify 语句返回了一个未定义的偏移量。在 DB 密码是必填字段中,它不能为空,并且在尝试根据哈希验证密码之前,我已经验证至少返回了 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";
}
?>
【问题讨论】:
-
您不必计算行数,只需测试结果即可。
-
你正在做
PDO::FETCH_ASSOC但随后按索引引用行$result[0] -
你检索到一个关联数组,所以使用
$result['password'] -
没有 FETCH_ASSOC 重复的原因是 PDO 检索了一行并创建了一个具有 both 关联数组键
['password']和数字数组索引[0]的数组( because its default isFETCH_BOTH) 并且会对SELECT中的每一列都这样做。这样做的充分理由很少。最好只明确请求您需要的类型。 -
@JayBlanchard 嗯,不,我不认为我会被归类为错字。