Я пытаюсь сохранить HTML, отправленный из текстового поля в базу данных. У меня есть текстовое поле внутри формы, которую я назвал "message". PHP-код, который обрабатывает это:
if(isset($_POST['submit'])){
if(isset($_POST['title']) && isset($_POST['message'])){
$title = $_POST['title'];
$message = $_POST['message'];
if(get_magic_quotes_gpc()){
$title = stripslashes($title);
$message = stripslashes($message);
}
$title = mysql_real_escape_string($title);
$message = mysql_real_escape_string($message);
$q = "INSERT INTO table (title,datetime,text) VALUES ('{$title}',NOW(),'{$message}')";
$rows_affected = $db->exec($q);
if($rows_affected > 0){
echo "<p>Done.</p>";
} else {
echo "<p>Failed. </p>";
}
}
}
Проблема, с которой я столкнулась, - это получить это и преобразовать символы новой строки в <br />
. Вот что я делаю:
$res = array();
$order = array("\r\n","\n","\r");
$replace = '<br />';
$q = "SELECT title,datetime,text FROM table";
$res = $db->get_all($q);
if($res){
foreach($res as $result){
$result['title'] = stripslashes($result['title']);
$result['text'] = str_replace($order, $replace, stripslashes($result['text']));
}
}
echo "<pre>";
print_r($res);
echo "</pre>";
Я просто не могу избавиться от этих досадных \r\n
в сообщении. Я попытался изменить $order
на
$order = array("\\r\\n","\\n","\\r");
// and even
$order = array("\\\r\\\n","\\\n","\\\r");
но ничего не работает. Любые идеи?
if ($res = $db->get_all('SELECT title,datetime,text FROM table')){
foreach ($res as &$result){
$result['text'] = nl2br($result['text']);
}
}
echo "<pre>";
print_r($res);
echo "</pre>";
Я сделал три вещи:
stripslashes
. Их не должно быть. Добавления слэшей mysql_real_escape_string
удаляются при выполнении запроса.nl2br
для новых строк. Зачем писать что-то самостоятельно, если оно уже встроено?&
перед $result
в цикле foreach
. Если бы я этого не делал, менялись только мелкие копии, а не сами переменные. Таким образом, изменений не было бы вообще.более обычный способ того, что nikic сделал
foreach ($data as $key => $row){
$data[$key]['text'] = nl2br($row['text']);
}
вы перезаписали свою временную переменную $result, в то время как вы должны написать измененную переменную обратно в массив.
и дать нашим переменным разумные имена.
Также рассмотрите использование htmlspecialchars(), если он предоставил текст.
Для получения данных, которые вам не нужно вкручивать с помощью str_replace/stripslashes.
$res = array();
$q = "SELECT title,datetime,text FROM table";
$res = $db->get_all($q);
if($res){
foreach($res as &$result){
$result['title'] = $result['title']; // Don't see the reason for stripslashes here
$result['text'] = nl2br($result['text']);
}
}
echo "<pre>";
print_r($res);
echo "</pre>";
Используйте nl2br для преобразования ваших \n в соответствующие разрывы строк HTML. (Примечание. Если вы хотите снова отобразить текст внутри текстового поля, например, для редактирования, вам нужно вывести "текст" как есть). Единственное, что вы хотели бы сделать, это использовать strip_tags
, чтобы предотвратить вставку HTML в ваш вывод.