Я использую php5.3.6 и mysql 5.1.56 и CodeIgniter. Вот что я сделал.
Введите текст в textarea, что-то вроде этого:
что это?
Я боб.
$ string = $ _POST ['name'];
$ insertdata = mysql_real_escape_string ($ string);
Вставьте $ insertdata в базу данных. Он показывает «что это? \ N \ n \ nI \ 'm bob.» (Без двойных кавычек) в таблице.
Запросите данные, хранящиеся в базе данных, используйте stripslashes на нем, а затем верните их в текстовое поле. Он показывает «что это? NnnI'm bob.» (Без двойных кавычек) в текстовом поле.
Мои вопросы:
mysql_real_escape_string () вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \ r, \, ', "и \ x1a.
Как я должен сохранить формат ввода textarea после использования 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));
(Вывод точно соответствует вашему вводу)