为什么PDO在不应该返回结果时返回结果


Why is PDO returning Result when it shouldn't?

>我只有一个文本字段,用户可以在其中输入用户名或电子邮件地址以重置密码。

首先是代码:(我只包含我知道问题所在的代码)。

try {
    // connect to database
    $dbh = sql_con();
    // prepare query
    $stmt = $dbh->prepare("
                     SELECT COUNT(*)
                     FROM
                         users
                     WHERE
                         user_login = :username
                     OR
                         user_email = :email
                     ");
    // execute query
    $stmt->execute(array(':username' => $username_email, ':email' => $username_email));
    if ($stmt->fetchAll() > 0) {
        // something was found
        // just echoing at the moment until i figure out what i am doing wrong
        echo 'i found something';
        exit;
    } else {
        // nothing found
        echo 'i found nothing';
        exit;
    }
}
catch (PDOException $e) {
    ExceptionErrorHandler($e);
    require_once($footer_inc);
    exit;
}

不知道我做错了什么,可能是非常愚蠢的事情,但是当我输入我知道不在数据库中的用户名或电子邮件地址时,它仍然echo es 我发现了一些东西

我做错了什么?

我打算使用rowCount但正如PHP手册所建议的那样,它指出:

PDOStatement::rowCount()返回受相应 PDOStatement 对象执行的最后一个DELETEINSERTUPDATE语句影响的行数。
如果关联PDOStatement执行的最后一个 SQL 语句是 SELECT .
语句中,某些数据库可能会返回该语句返回的行数。
但是,并非所有数据库都保证此行为,便携式应用程序不应依赖此行为。

所以基本上PHP手册说我应该在执行真正的查询之前做一个Count(*)然后处理结果。

你的意思是if (count($stmt->fetchAll()) > 0) {

那是因为fetchAll()返回一个数组。 即使查询结果没有行,您仍然至少会得到一个空数组,并且...

php > var_dump(array() > 0);
bool(true)

你需要做的

if ($stmt->rowCount > 0) { ... }

相反。此外,您正在执行COUNT(*),因此无论匹配的内容如何,您都会获得包含匹配计数的单行结果。您需要获取该行,并检查该计数字段的值。

$statement -> fetchAll() 将返回一个数组。 将其与 0 进行比较是没有意义的。 您可能打算计算 () 结果集中从 $statement -> fetchAll () 返回的元素数