mysql_real_escape_string и одинарные кавычки - PullRequest
4 голосов
/ 29 июля 2009

Я очень расстроен.Я хочу иметь возможность вставлять в мою базу данных имена в одинарных кавычках - например, О'Коннор.

Итак, вставляя в БД, я делаю:

 $lname = mysql_real_escape_string($_POST['lname']);

И затемЯ вставляю $ lname в базу данных.

Когда она находится в базе данных, она выглядит как O \ 'Connor.

Итак, если бы я вспомнил эту фамилию в своем веб-приложении, япридется использовать:

 $lname = stripslashes($r["lname"]);

Кажется, все это работает нормально.Тем не менее, у меня есть функция поиска, которая будет искать фамилии и отображать результаты.Когда я ищу, мне нужно искать O \ 'Connor, чтобы получить какие-либо результаты.

Видите ли, после того, как я ищу, текстовое поле автоматически сохраняет значение того, что только что искали (используя сеансы).Итак, мой код такой:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

Как я уже говорил ранее, при поиске я должен использовать «O \ 'Connor», а затем после поиска значение в текстовом поле становится «O \».\\\ 'Коннор "

Это было неприятно пытаться понять это.Кто-нибудь знает, что я делаю не так?Спасибо!

РЕДАКТИРОВАТЬ:

Вот мой файл php5.ini, касающийся магических цитат:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

Однако мой сайт размещен на GoDaddy, а я нетесть права на редактирование файла: (

Ответы [ 6 ]

7 голосов
/ 29 июля 2009

Похоже, Магические кавычки включены в вашей конфигурации PHP.

Чтобы проверить, действительно ли он включен:

echo get_magic_quotes_gpc();

Чтобы отключить , отредактируйте файл php.ini:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

Или добавьте эту строку в ваш .htaccess:

php_flag magic_quotes_gpc Off
1 голос
/ 29 июля 2009

Небольшое редактирование функции fixinput, чтобы проверить, действительно ли в вашей установке PHP действительно есть escape-строка (в более старых версиях нет):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }
1 голос
/ 29 июля 2009

Волшебные кавычки включены. Это означает, что все, что размещено в post или get или других подобных местах, автоматически экранируется, поэтому начинающим программистам не нужно беспокоиться об этом. Это устарело в текущей версии PHP, если я правильно помню.

То, что вы хотите сделать для этого, и чтобы скрипт выполнялся одинаково для любой конфигурации, является следующим:

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

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

0 голосов
/ 29 июля 2009

Когда он находится в БД, он выглядит как O \ 'Коннор.

Итак, если я вспомню эту фамилию в своем веб-приложении, мне придется использовать:

 $lname = stripslashes($r["lname"]);

Неправильно! Когда вы экранируете строки с mysql_real_escape_string, они экранируются только в запросе. База данных интерпретирует запрос, поэтому данные попадают в базу данных без каких-либо escape-символов. Вы не должны использовать stripslashes при извлечении данных из базы данных. Если вы так думаете, то это означает, что данные в вашей базе данных искажены. Скорее всего, потому что у вас включены магические кавычки.

Вы должны:

  • Отключите магические кавычки или полностью измените их действие. Подробнее см. в руководстве .
  • Либо используйте связанные параметры (лучшее решение) или экранируйте все переменные с помощью mysql_real_escape_string. Вы должны сделать это там, где вы строите запрос.
  • Ничего не делать с вещами, которые вы извлекаете из базы данных.

В частности, не делайте функции в стиле fixinput и вариантов, которые перечислены в некоторых ответах здесь. Это неправильный способ решения проблемы, потому что он испортит любые данные, которые не приходят из http-запроса.

0 голосов
/ 29 июля 2009

Я не проверяю, включено ли / выключено get_magic_quotes_gpc.

Я просто делаю $lname = mysql_real_escape_string(stripslashes($_POST['lname']));, поэтому, если нет цитируемого текста, он не будет удалять косые черты .. Если он заключен в кавычки, он удалит их.

и это творит чудеса для меня!

0 голосов
/ 29 июля 2009

Все, что вам нужно сделать, это взять поисковый запрос, mysql_real_escape_string, и он должен быть в полном порядке. Хотя лучший способ сделать это - никогда не сохранять его как сбежавший, а вместо этого просто сбрасывать его - все идет в базу данных.

Вместо этого сделайте следующее:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);
...