mysql_real_escape_string странное поведение апостроф?
У меня есть форма, и пользователь вводит, например (обратите внимание на апостроф в конце строки)
My Bday'
Теперь я хочу лишить апострофов, таких простых как... не убегать от них, не добавлять косые черты, просто избавиться от них
Во-первых, у меня есть следующее:
$event_title = mysql_real_escape_string($_POST['event_title']);
echo "<br /><br /><br />event title is $event_title";
В результате возвращается следующее:
event title is My Bday\\\'
Почему 3 слеша?
Итак, я продолжу и справлюсь с этим, используя следующее:
$event_title = str_replace("'", "", $event_title);
$event_title = stripslashes($event_title);
Затем я возвращаю его снова, чтобы проверить результаты
echo "<br /><br /><br />event title is $event_title";
Я получаю следующее:
event title is My Bday\
Есть идеи, что происходит? Я просто хочу лишить апостофов и слешей, но почему-то этого не происходит
Кстати, magic_quotes_gpc выключен
Если я не использую полоски, поэтому оставляя их для работы с MySQL, я получаю следующую ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'Private',
event_notes = '' where user_event_id = '35'' at line 3
update user_events set event_date = '2012-11-17', event_title = 'My Bday\\\',
event_vis = 'Private', event_notes = '' where user_event_id = '35'
ОК, дальнейшее редактирование:
Я попробовал это:
$event_title = $_POST['event_title'];
$event_title = str_replace("'", "", $event_title);
$event_title = trim($event_title);
$event_title = mysql_real_escape_string($event_title);
echo "<br /><br /><br />event title is $event_title";
и я получаю это:
event title is My Bday\\
Я просто хочу избавиться от апострофов, очевидно, что здесь происходит что-то еще, но это меня достало!
3 ответа
Что происходит, это:
mysql_real_escape_string
экранирует все символы, которые должны быть экранированы, добавляя косую черту перед экранированным символом. Но добавление только косой черты приведет к сохранению символа как неэкранированного в БД, поэтому перед вставкой также следует экранировать косую черту...
Вот почему у вас есть My BDay\\\'
, Если это значение сохраняется в БД, конечный результат будет My BDay\'
,
Но когда Ты это делаешь str_replace("'", "", 'My BDay\\\'');
Вы закончите с My BDay\\\
и после звонка stripslashes
на это вы получите My BDay\
- это абсолютно правильно!
Так что не беспокойтесь о том, как выглядит строка после вызова mysql_real_escape_string
, просто сохраните это значение в БД, и после его получения вы получите My BDay'
снова...
РЕДАКТИРОВАТЬ Как вы приходите к одной косой из трех после звонка stripslasshes
? Функция переходит от начала строки к ее концу и ищет любые экранированные символы косой черты, чтобы удалить экранирующую косую черту. Таким образом, он находит первые две косые черты и удаляет одну, но все еще две остаются (одна только что обработанная и третья), поэтому он обрабатывает следующие две найденные слэши, в результате которых останется только одна косая черта...
Если бы вы назвали полоски на строке My BDay\\\'
- это приведет к My BDay'
...
EDIT2 мой плохой... следующие две косые черты добавляются, вероятно, потому что у вас есть magic_quotes_gpc
ON - выключить или позвонить mysql_real_escape_string(stripslashes($string))
,
Одна косая черта, чтобы избежать апостроф, другая, чтобы избежать косая черта, которые избегают апостроф.
Внутренне mysql интерпретирует "как"
В ваших настройках php параметр string_splash включен, и поэтому, когда строка передается из формы - она уже извлечена... Теперь вы используете mysql_real_escape_string - которая исключает "символ восклицания", а также одинарные кавычки. и вот почему три слеша..
Попробуйте использовать эту функцию - которую я часто использую
function sanitize( $value )
{
if( get_magic_quotes_gpc() )
{
$value = stripslashes( $value );
}
//check if this function exists
if( function_exists( "mysql_real_escape_string" ) )
{
$value = mysql_real_escape_string( $value );
}
//for PHP version < 4.3.0 use addslashes
else
{
$value = addslashes( $value );
}
return $value;
}
Это не специально для php 4 или старше... Функция работает, чтобы экранировать строку и удостовериться, что она не экранирует ее дважды (это вопрос, заданный beign)
if (function_exists ("mysql_real_escape_string")) - эта строка сбрасывается, если соединение с базой данных доступно и
еще одна часть этого, если условие гарантирует, что оно работает, если соединение с базой данных не доступно, и поддержка php 4 добавлена только за счет...