1

为什么这部分代码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查询影响的行数的解决方法。

4

3 回答 3

2

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

您可以改为执行 SELECT TRUE:

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

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

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

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

于 2011-12-27T21:24:00.967 回答
1

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

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

于 2011-12-27T21:31:18.623 回答
0

尝试简单而不绑定:

$res = $dbh->query('SELECT COUNT(`user_id`) AS total FROM `users` WHERE `username`= "'.$username.'" ')->fetch();

return ($res['total'] == 1) ? true : false;
于 2011-12-27T21:31:36.590 回答