mysql_real_escape_string и одинарная кавычка
-
05-07-2019 - |
Вопрос
Я очень расстроен.Я хочу иметь возможность вставлять в свою базу данных имена в одинарных кавычках, например, О'Коннор.
Итак, при вставке в БД я делаю:
$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']);