PHP PDO num_rows问题

时间:2013-04-18 16:52:38

标签: php pdo

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

答案 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>";
}