2013-03-07 2 views
4

Я стараюсь избегать задавать глупые вопросы, но по какой-то причине это просто не работает. Я извлекаю некоторый текст из базы данных, включая новые строки. При использовании эхо сразу, это выход:не может заменить n в php содержимым из базы данных

=== BOLD TEXT ===\nHere is some text. 

Это, как я извлечь его:

$row = $query->row(); 
$content=$row->course_content; 

Ни один из следующих иметь какой-либо эффект .....

$content= str_replace(array("\r\n", "\r", "\n"), "<br />", $content); 
$content= str_replace("\n", " ", $content); 
$content = nl2br($content); 

ОДНАКО, когда я жестко кодирую его в строке к исходному заявлению,

$content="=== BOLD TEXT ===\nHere is some text."; 

pang! он работает ... любые идеи относительно того, почему он отказывается принять ввод базы данных, но в порядке с ручной строкой?

Полный код:

//Switch between these two: 
$row = $query->row(); 
$content=$row->course_content; 
$content="=== BOLD TEXT ===\nHere is some text."; 
$content = str_replace(array("\r\n", "\r", "\n"), "<br />", $content); 
$content = str_replace("\n", " ", $content); 
$content = nl2br($content);  
echo $content; 
+0

Каков тип переменной 'course_content' в вашей базе данных? – christopher

+0

Это длинный текст \t с utf8_general_ci Может ли это быть проблемой? – MaxQ

+0

Вы пытались преобразовать его в обычную старую строку и посмотреть, что произойдет? Поскольку PHP свободно набирается, иногда сложно отслеживать типы, которые перемещаются по коду. – christopher

ответ

3

Когда вы сделаете это:

$row = $query->row(); 
$content=$row->course_content; 
echo $content; 

ли вы на самом деле видите \n выводимой на выходе? Или он действительно печатает новый символ линии?

Если это первый, то у вас есть экранированная строка новой строки в строке базы данных вместо фактического символа новой строки. Другими словами, ваша строка базы данных содержит два символа \ и n, которые не делают новую строку.

Попробуйте эту замену вместо (или в дополнение к, чтобы быть полностью безопасным):

$content = str_replace(array('\r\n', '\r', '\n'), "<br />", $content); 

single quotes syntax для строки вызывает PHP, чтобы не превратить два символа \ и n в символ новой строки, таким образом должен фактически соответствовать тому, что находится в вашей базе данных. (Вы также можете использовать \\n, где первая слэш ускользает второй слэш, предотвращая его от превращения в символ новой строки.)

Edit: Чтобы ответить на ваш вопрос, предполагая, что вы имели в виду mysql_real_escape_string, то да, это ожидаемое поведение , Из документации:

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

+0

Tha nks, это работает! Но это нормально, или я сделал что-то подозрительное в базе данных? Я использовал real_escape_string перед тем, как вставить его. – MaxQ

2
$content="=== BOLD TEXT ===\nHere is some text."; 

Если вы хотите заменить \n, вы должны искать его, используя одиночные кавычки - '\n' (вместо "\n") - два имеют очень разные значения в PHP.

+0

Да, это решило, но почему nl2br ($ content) ничего не сделал? – MaxQ

+0

@Manfred, 'nl2br' ищет новые строковые символы. Кажется, у вас есть новые строковые символы в вашей строке. –

+0

Спасибо, это работает! Но так ли это «нормально», или я сделал что-то подозрительное в базе данных? Я использовал real_escape_string, прежде чем вставлять его. – MaxQ

Смежные вопросы