mysql_real_escape_string и одиночная кавычка

Я очень расстроен. Я хочу иметь возможность вставлять в мои имена базы данных одинарные кавычки – например, O'Connor.

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

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

И затем я вставляю $ lname в БД.

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

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

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

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

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

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

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

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

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

Вот мой файл php5.ini относительно магических цитат:

  ; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = On ; Magic quotes for runtime-generated data, eg data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off 

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

Похоже, что Magic Quotes включена в вашей конфигурации 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, eg 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 

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

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

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

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

Небольшое редактирование функции 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); } } 

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

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

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

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

Вам следует:

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

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

Я не проверю, get_magic_quotes_gpc / get_magic_quotes_gpc .

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

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

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

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

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