Я очень расстроен. Я хочу иметь возможность вставлять в мои имена базы данных одинарные кавычки – например, 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']);