Intereting Posts
Как вызвать функцию из .so-файла, используя php-скрипт? Ящик «laravel / homestead» не найден PHP Upload IF ISSET всегда говорит, что это так? array_key_exists не работает Выражение не допускается по значению поля по умолчанию Загрузка изображения на сервер в Android Как найти наиболее распространенные слова в базе данных MySQL и средний второй столбец Определение иерархии классов объекта во время выполнения Эффективный способ сохранения массива и его ключей в базе данных функция возвращается только один раз, почему? Как подключить выпуск разработчика Arduino Uno Wifi к PHP Ошибка TCPDF: невозможно получить размер изображения session_start (): Не удалось инициализировать модуль памяти: memcache (путь: / var / lib / php5) в /usr/share/phpmyadmin/libraries/session.inc.php в строке 81 Один из функций класса, делать или нет? Как удалить постоянную ссылку старого пользовательского типа сообщений после перезаписи URL-адреса, чтобы исключить пул?

Сброс логических карт MySQL

На более старом сервере я использую то, что я не могу использовать подготовленные инструкции, я в настоящее время пытаюсь полностью избежать ввода пользователя перед отправкой его в MySQL. Для этого я использую функцию PHP mysql_real_escape_string .

Поскольку эта функция не ускользает от подстановочных символов MySQL% и _, я использую addcslashes чтобы избежать их.

Когда я посылаю что-то вроде:

 test_test " ' 

в базу данных, а затем зачитайте ее в базе данных:

 test\_test " ' 

Глядя на это, я не могу понять, почему у _ есть предыдущая обратная косая черта, но «и» не делают. Поскольку все они экранированы с помощью \ surely _ 'и "все должно выглядеть одинаково, т.е. все имеют escape-символ, видимый или все это не видно.

Выполняется ли экранирование автоматически

Может кто-нибудь объяснить это?

_ и % не являются подстановочными знаками в MySQL в целом и не должны быть экранированы для того, чтобы помещать их в обычные строковые литералы. mysql_real_escape_string является правильным и достаточным для этой цели. addcslashes не следует использовать.

_ и % являются особыми только в контексте LIKE разметки. Если вы хотите подготовить строки для литерального использования в инструкции LIKE , чтобы 100% соответствовало стопроцентной, а не только любой строке, начинающейся со ста, у вас есть два уровня побега, о которых можно беспокоиться.

Первый – это ускользнуть. Обработка LIKE происходит полностью внутри SQL, и если вы хотите превратить литеральную строку в литеральное выражение LIKE, вы должны выполнить этот шаг, даже если вы используете параметризованные запросы !

В этой схеме _ и % являются специальными и должны быть экранированы. Эквивалентный символ также должен быть экранирован. Согласно ANSI SQL, символы, отличные от них, не должны быть экранированы: \' было бы неправильно. (Хотя MySQL, как правило, позволяет вам избежать неприятностей).

Сделав это, вы переходите ко второму уровню экранирования, который представляет собой простую старую строку литералов. Это происходит за пределами SQL, создавая SQL, поэтому это должно быть сделано после шага LIKE escaping. Для MySQL это mysql_real_escape_string как и раньше; для других баз данных будет другая функция, вы можете просто использовать параметризованные запросы, чтобы избежать необходимости этого делать.

Проблема, которая приводит к путанице здесь, заключается в том, что в MySQL используется обратная косая черта как escape-символ для обоих вложенных шагов экранирования! Поэтому, если вы хотите совместить строку с символом буквенного процента, вам придется сбрасывать двойное обратное слэш и говорить LIKE 'something\\%' . Или, если это в литературе PHP, которая также использует обратную косую черту, "LIKE 'something\\\\%'" . Argh!

Это неверно в соответствии с ANSI SQL, в котором говорится, что: в строковых литералах обратные косые черты означают буквальные обратные косые черты и способ избежать одиночной кавычки – это '' ; в выражениях LIKE по умолчанию не существует escape-символа.

Поэтому, если вы хотите LIKE-escape в переносном режиме, вы должны переопределить поведение по умолчанию (неправильное) и указать свой собственный escape-символ, используя конструкцию LIKE ... ESCAPE ... Для здравомыслия мы выберем что-то другое, кроме проклятой обратной косой черты!

 function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); } $escapedname= mysql_real_escape_string(like($name, '=')); $query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ..."; 

или с параметрами (например, в PDO):

 $q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR); 

(Если вы хотите больше времени на переносимость, вы также можете повеселиться, пытаясь учесть MS SQL Server и Sybase, где [ символ также является некорректным, особенным в инструкции LIKE и должен быть экранирован. Argh.)