-1

当我尝试使用现有帐户登录时,代码运行正常,但是当我尝试使用不存在的帐户登录时,它应该执行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>";
}
4

4 回答 4

3

fetchColumn()不计算行数,它会从结果集中的下一条记录中返回特定的列值(或者false如果您位于结果集的末尾)。如果您使用的是 MySQL,您可以使用它rowCount()来计算结果集中的行数(但是,此方法不支持SELECT跨所有数据库类型的语句)。

或者,由于您似乎只关心返回的一行,您可以简单地评估$row. 如果是,false那么您没有收到返回的记录。我可能会建议LIMIT 1在您的查询中添加一个显式,以便代码的读者清楚地知道查询只能返回 0 或 1 条记录。

于 2013-04-18T16:55:54.033 回答
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>";
}
于 2013-04-18T18:18:56.337 回答
0

PDO 中有一个漂亮的函数,称为rowCount()您应该使用它,以了解您的查询是否返回任何行,在这种情况下,1是真还是0假。

你可以像这样使用它;

$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.';
}
于 2013-04-18T16:56:39.690 回答
0

根据文档 fetchColumn()返回一个字符串,因此count 将始终返回1。你真正需要的是PDOStatement::rowCount

$stm->rowCount();
于 2013-04-18T16:57:07.287 回答