Заставьте MySQL не преобразовывать строку в число - PullRequest
4 голосов
/ 09 января 2012

У меня есть запрос в моем приложении, который выбирает пользователей из таблицы по идентификатору или по имени пользователя:

SELECT * FROM users WHERE id = '$x' OR username = '$x'

Это работает, когда указаны имена пользователей, такие как foo, bar123 или идентификаторы, такие как 1, 123. Но когда я даю имя пользователя, например 2foo, он выбирает пользователя 2foo и пользователя с id=2. Таким образом, он принимает 2 из 2foo и находит пользователя. Кроме того, я получаю предупреждение: 1292: усеченное неверное значение DOUBLE: 2foo .

Есть ли способ сказать MySQL, чтобы он не делал это преобразование (для этого запроса, но не для всей базы данных)? Или мне нужно выполнить фильтрацию после запроса, чтобы отбросить ложные результаты?

1 Ответ

5 голосов
/ 09 января 2012

Ваш запрос сформирован таким образом, что в MySQL срабатывает поведение "это-не-функция-не-ошибка": вы сравниваете ту же строку ('$ x') с числовым полем (id ) и в поле varchar (имя пользователя).

Хотя я уверен, что есть способы заставить эту работу работать в SQL, я подозреваю, что единственный правильный способ - это исправить PHP, который создает запрос. Что-то вроде

if (is_numeric($x)) $sql="SELECT * FROM users WHERE id = '$x' OR username = '$x'";
else $sql="SELECT * FROM users WHERE username = '$x'";

должно помочь.

Вот версия SQL, просто для полноты:

SELECT * FROM users WHERE id = IF('$x' REGEXP '^[0-9]+$','$x',0) OR username = '$x'

Примечание. Сформируйте OQ. Я предполагаю, что $ x уже экранирован.

...