сохранить формат ввода textarea после использования mysql_real_escape_string для хранения - PullRequest
3 голосов
/ 11 мая 2011

Я использую 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 \ nIm'm bob.» (Без двойных кавычек).

  5. Запрос данных, хранящихся в базе данных, используйтеполоски на нем, а затем положить его обратно в текстовое поле.Он показывает «что это? 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 (), все работает нормально.
  • Я не хочу использовать addlashes (), поскольку он не так безопасен, как mysql_real_escape_string ()Насколько я знаю.

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

Ответы [ 5 ]

1 голос
/ 11 мая 2011

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

1 голос
/ 11 мая 2011

Это действительно очень похоже на 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.

0 голосов
/ 04 июля 2015

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

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

echo stripslashes(str_replace('\r\n',PHP_EOL,$insertdata)); (вывод точно такой же, как ваш ввод)

0 голосов
/ 20 октября 2011

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

// 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]».

Примечания

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

0 голосов
/ 11 мая 2011

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

...