Инструкция PHP PDO возвращает неверное количество строк с помощью SELECT? - PullRequest
1 голос
/ 28 декабря 2011

Почему эта часть кода возвращает 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 query.

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Поскольку COUNT () всегда будет возвращать 1 строку, хотя ее значение может быть 0.

Вместо этого можно выполнить команду SELECT TRUE:

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

Или вы можете проверить, является ли значениебольше 0:

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

Кстати - часть «? true: false» является избыточной;наличие логического условия само по себе делает именно это.

1 голос
/ 28 декабря 2011

Вы проверяете количество строк результатов. Поскольку ваш запрос всегда возвращает ровно одну строку результата, rowCount() возвращает 1. Одна строка результата будет содержать счетчик, например, 0 или 1 по вашему запросу.

Вам необходимо проверить это значение счетчика в строке результатов или изменить свой запрос, чтобы он не возвращал никаких строк в случае, если пользователя не существует.

0 голосов
/ 28 декабря 2011

Попробуйте просто без привязки:

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

return ($res['total'] == 1) ? true : false;
...