Intereting Posts
Какие обратные вызовы называются? Есть ли способ, чтобы PHP обнаружил поврежденный образ? decodeURIComponent (uri) не работает? Почему дата PHP ('m', strtotime ('- 1 months')) не работает корректно на сегодняшний день? 07/31 Лучший способ получить счетчик результатов до применения LIMIT Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и комета? Как защитить веб-приложение, проданное на основе лицензии, от пиратства? Измените эту функцию js так, чтобы она использовала значение, полученное из db вместо значений, указанных в массиве, для генерации опций Select Как вы можете перевести этот запрос в синтаксис zend framework 2? Символ сеанса – как он работает? usort (): Массив был изменен функцией сравнения пользователей как получить выход из процесса opend по popen в php? Почему переопределение параметров метода является нарушением строгих стандартов в PHP? Получение полного URL-адреса с #tag PHP создает новый сеанс с каждой перезагрузкой

mysql автоматически передает строки в целое число

Я только что заметил, что если я сделаю запрос MySQL следующим образом:

SELECT 1 FROM myTable WHERE id = 'asdf' 

Затем строка 'asdf' отбрасывается до 0 . Это означает, что у меня есть запись с id 0 будет соответствовать. Формат поля idint(8).

Каков наилучший способ:

  • Мне нужно проверить (например, PHP), что мое значение только числовое?
  • Есть ли способ MySQL сделать это?
  • Я должен удалить свою запись с идентификатором 0 ? (Плохо)

Сначала вы должны дезинфицировать свои входы через PHP.

 $id = 'asdf'; if(is_numeric($id)){ $query("SELECT 1 FROM myTable WHERE id = $id"); }else{ die("ID is not numeric"); } 

Или вы можете сделать:

  SELECT 1 FROM myTable WHERE id = 'asdf' AND 'asdf' REGEXP '^-?[0-9]+$' 

Это вызовет регулярное выражение = false, в результате чего строки не возвращаются.

Просто напишите свои запросы, чтобы они не использовали числовые поля, как если бы они были текстовыми.

Если id – числовое поле, то предложение where никогда не может быть полезным. Да, было бы хорошо, если бы MySQL активно жаловался на это, но в принципе вы не должны писать код, который запускает плохие запросы для начала.

Как этот запрос попал в вашу систему? Является ли 'asdf' частью прямого ввода пользователем? Можете ли вы использовать параметризованный SQL вместо этого?

Если вы действительно хотите запросить числовое поле, вы должны убедиться, что ваш ввод сначала является числовым. Преобразуйте текст в целое число в код вызова, а не в базу данных.

Поскольку pdo подготовил операторы, связываясь с правильными типами, не будет возникать никаких ошибок (кроме случаев, когда включен строгий режим mysql ), ваш единственный выбор – обеспечить и контролировать типы ваших переменных внутри вашего php, чтобы «исправить» допустимость этих языков.

[спасибо комментаторам]