сохранить формат ввода textarea после использования mysql_real_escape_string для хранения

Я использую php5.3.6 и mysql 5.1.56 и CodeIgniter. Вот что я сделал.

  1. Введите текст в textarea, что-то вроде этого:


    что это?

    Я боб.


  2. $ string = $ _POST ['name'];

  3. $ insertdata = mysql_real_escape_string ($ string);

  4. Вставьте $ insertdata в базу данных. Он показывает «что это? \ N \ n \ nI \ 'm bob.» (Без двойных кавычек) в таблице.

  5. Запросите данные, хранящиеся в базе данных, используйте stripslashes на нем, а затем верните их в текстовое поле. Он показывает «что это? NnnI'm bob.» (Без двойных кавычек) в текстовом поле.

Мои вопросы:

  • На шаге 4 не должно быть «что это? \ N \ n \ n Я боб». хранится в таблице? Я проверил руководство по php. В нем говорится:

mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \ r, \, ', "и \ x1a.

  • Как я должен сохранить формат ввода textarea после использования mysql_real_escape_string ()?

  • Есть ли в любом случае выбор, какой косой чертой, а что нет?

Заметки:

  • отключена опция магии кавычек
  • Я не использовал stripslashes () перед использованием mysql_real_escape_string ()
  • Если я использую addlashes () вместо mysql_real_escape_string (), все работает нормально.
  • Я не хочу использовать addslashes (), поскольку он не настолько безопасен, как mysql_real_escape_string (), насколько мне известно.

Спасибо, Мило

Это действительно очень похоже на magic_quotes_gpc = On . Вы отключите его в php.ini или во время выполнения? Он должен быть первым, иначе он останется включенным.

http://www.php.net/manual/en/security.magicquotes.disabling.php

The magic_quotes_gpc directive may only be disabled at the system level, and not at runtime. In otherwords, use of ini_set() is not an option.

Вы должны избегать данных, прежде чем вставлять их в базу данных, чтобы гарантировать, что вы не создадите сломанные запросы и избегаете инъекций SQL. Однако, когда вы извлекаете эти данные через SELECT, вы получите данные, не привязанные к ним, готовые к использованию.

MySQL ускользает от строки, но при отображении результата возвращается к вам, это даст вам тот же результат, как если бы он не был сохранен.

Короткий ответ:

 // double quotes are *very* important, or chars are not interpreted $text_from_db=str_replace("\\r","\r",str_replace("\\n","\n",$text_from_db)); 

Длительный ответ

Довольно просто, но сложно. Вы пишете свое текстовое поле и нажимаете клавишу «return», там размещается \ r \ n (в системах Windows) со слэшами, которые сбрасывают буквы «r» и «n», повышая их особое значение возврата каретки и новой строки. Вы на самом деле не можете их видеть, потому что они являются «непечатаемыми» символами. Сама косая черта (0x1B) невидима, то есть одна косая черта – это символ «непечатаемый», чтобы сделать его видимым, вам нужно «преобразовать» его в печатный символ слэш (0x5C) и добиться того, что вам нужно удвоить Это "\\". Теперь вернемся к вопросу: если вы можете прочитать косую черту, возможно, это означает, что слэш не является 0x1B, а скорее 0x5C, поэтому «n» и «r» теряют свое особое значение, и вы получаете их как простые строки. Код, который я разместил, выполняет это преобразование, преобразуя строку «[0x5C] n» в символ «[0x1B]».

Заметки

Надеюсь, это поможет, это было для меня. ВАЖНО: это ненормально, что текст, который поступает из db, имеет эту проблему, если он был сохранен правильно. Мое предложение состоит в том, чтобы вставить тройную проверку и извлечение, потому что (учитывая проблему) вы могли бы дважды использовать цитату.

Лучшее решение ..

$insertdata = mysql_real_escape_string($string); (Вы можете вставить его в свою базу данных, если хотите)

echo stripslashes(str_replace('\r\n',PHP_EOL,$insertdata)); (Вывод точно соответствует вашему вводу)