【问题标题】:Why is PDO returning Result when it shouldn't?为什么 PDO 在不应该返回 Result 时返回?
【发布时间】:2012-04-17 16:32:16
【问题描述】:

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

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

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;
}

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

我做错了什么?

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

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

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

【问题讨论】:

    标签: php mysqli pdo resultset


    【解决方案1】:

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

    【讨论】:

    • 谢谢...我将代码更改为您在上面显示的内容并更改了 SQL 查询,现在它可以工作了。谢谢你,phplover
    【解决方案2】:

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

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

    你需要做的

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

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

    【讨论】:

    • 问题中提到了他为什么不使用这个。这就是我投反对票的原因。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多