【问题标题】:PHP PDO statement returns incorrect row count with SELECT?PHP PDO 语句使用 SELECT 返回不正确的行数?
【发布时间】:2023-03-09 09:10:01
【问题描述】:

为什么这部分代码即使不应该返回true

$stmt = $dbh->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username`= :username LIMIT 1");
$stmt->bindParam(':username', $username);
$stmt->execute();
return ($stmt->rowCount() == 1) ? true : false;

如果我在已经注册的字段中输入用户名,它会返回 true,然后输出:

That username has already been taken!

但如果我输入一个尚未注册的用户名,它仍然返回 true 并输出上面的行。我不确定这是为什么以及如何解决。

我知道PHP manual 声明rowCount()SELECT 查询存在一些问题,但我找不到返回受SELECT 查询影响的行数的解决方法。

【问题讨论】:

    标签: php mysql pdo rowcount prepared-statement


    【解决方案1】:

    因为 COUNT() 将始终返回 1 行,尽管它的值可能为 0。

    您可以改为执行 SELECT TRUE:

    SELECT TRUE FROM `users` WHERE `username`= :username LIMIT 1
    

    或者你可以检查该值是否大于0:

    return ($stmt->fetchColumn() > 0);
    

    顺便说一句 - “?真:假”部分是多余的;拥有布尔条件本身就可以做到这一点。

    【讨论】:

    • 感谢您的回答 - 我想了解更多有关 SELECT TRUE 的信息。有没有关于它的文件?我试过搜索,但找不到任何东西。
    • 1+1的情况下执行select 1select 'blahblahblah' or select 1+1. You don't HAVE to select from a table, you can select fixed text which simply gets returned (or returns 2`没有什么不同)。但是,某些 DB(如 oracle)要求您从一个名为“dual”的特殊伪表中选择此类查询。
    【解决方案2】:

    您正在检查结果行数。由于您的查询始终只返回一个结果行,rowCount() 返回 1。一个结果行将包含计数,例如0 或 1 in 与您的查询。

    您需要检查结果行中的计数值或更改您的查询以在用户不存在的情况下不返回任何行。

    【讨论】:

      【解决方案3】:

      尝试简单而不绑定:

      $res = $dbh->query('SELECT COUNT(`user_id`) AS total FROM `users` WHERE `username`= "'.$username.'" ')->fetch();
      
      return ($res['total'] == 1) ? true : false;
      

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        • 2012-07-27
        相关资源
        最近更新 更多