Вопрос

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

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

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

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

В базе данных он отображается как О'Коннор.

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

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

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

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

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

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

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

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

Вот мой файл 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, и у меня нет прав на редактирование файла :(

Это было полезно?

Решение

Это звучит как Волшебные цитаты включены в вашей конфигурации 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

Другие советы

Волшебные кавычки включены.Это означает, что все, что помещено в post, get или другие подобные места, автоматически экранируется, так что начинающим программистам не придется об этом слишком беспокоиться.Если я правильно помню, в текущей версии 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 при извлечении данных из базы данных.Если вы думаете, что да, то это означает, что данные в вашей базе данных искажены.Скорее всего потому, что у вас включены волшебные кавычки.

Вам следует:

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

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

я не проверяю 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']);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top