为什么这部分代码返回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;