当我尝试使用现有帐户登录时,代码运行正常但是当我尝试使用不存在的帐户登录时,它应该执行else
部分和echo
消息但它仍然执行if
块中定义的部分。为什么呢?
欢迎任何其他提示
$sql = "SELECT email,password,id FROM user WHERE email=? AND password=?";
$stm = $db->prepare($sql);
$stm->execute(array($email,$password));
$row = $stm->fetch(PDO::FETCH_ASSOC);
$number_of_rows = $stm->fetchColumn();
if(count($number_of_rows)==1){
$_SESSION['id']=$row['id'];
header('Location: cpanel/#welcome');
}else{
echo "<font style='background-color: #F9C5CA'>Error: Your email and/or password are incorrect. Please try again.</font>";
}
答案 0 :(得分:3)
fetchColumn()
不计算行数,它会从结果集中的下一条记录返回特定的列值(如果您位于结果集的末尾,则返回false
)。如果您使用的是MySQL,则可以使用rowCount()
来计算结果集中的行数(但是,对于所有数据库类型的SELECT
语句,此方法不受支持)。
或者,由于您似乎只关心返回一行,因此您只需评估$row
的值即可。如果是false
那么你没有得到记录。我可能会建议在查询中添加一个显式的LIMIT 1
,以便代码读者清楚地知道查询只能返回0或1条记录。
答案 1 :(得分:0)
在PDO中有一个名为rowCount()
的漂亮函数你应该使用它来知道你的查询是否返回任何行,在这种情况下,1
表示true或0
false。
您可以像使用它一样使用
$stmt = $conn->prepare("SELECT user, pass FROM foo WHERE username =?
AND password = ?");
$stmt->execute(array($user,$pass));
现在,到了伯爵。
if($stmt->rowCount() > 0){echo 'username found';}else {
echo 'wrong login details.';
}
答案 2 :(得分:0)
根据documentation fetchColumn()
返回一个字符串,因此count
将始终返回1
。你真正需要的是PDOStatement::rowCount
:
$stm->rowCount();
答案 3 :(得分:0)
因此,检查$row
就足够了。
但是,请求电子邮件和密码(您已经拥有)也没有任何意义
因此,您可以使用fetchColumn(),但不使用fetch:
$sql = "SELECT id FROM user WHERE email=? AND password=?";
$stm = $db->prepare($sql);
$stm->execute(array($email,$password));
$id = $stm->fetchColumn();
if ($id) {
$_SESSION['id']=$id;
header('Location: cpanel/#welcome');
exit;
} else {
echo "<font style='background-color: #F9C5CA'>Error: Your email and/or password are incorrect. Please try again.</font>";
}