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 добавлена ​​только за счет...

Другие вопросы по тегам