PHP PDO语句使用SELECT返回错误的行数


PHP PDO statement returns incorrect row count with SELECT?

为什么这部分代码返回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手册指出rowCount()SELECT查询的一些问题,但我找不到一个解决办法,返回受SELECT查询影响的行数。

因为COUNT()总是返回1行,尽管它的值可能是0。

你可以用SELECT TRUE来代替:

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

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

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

BTW -"?"True: false"部分冗余;布尔条件本身就可以做到这一点。

您正在检查结果行数。由于查询总是返回一个结果行,因此rowCount()返回1。一个结果行将包含计数,例如0或1在您的查询。

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

尝试简单而不绑定:

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