0

我正在尝试将从 textarea 发布的 HTML 存储到数据库中。我在我称之为“消息”的表单中有一个文本区域。处理它的 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");

但似乎没有任何效果。有任何想法吗?

4

3 回答 3

0
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用于新行。如果它已经内置,为什么还要自己写?
  • 我在循环&的前面添加了一个。如果我不这样做,只会修改浅拷贝,而不是变量本身。因此根本不会有任何变化。$resultforeach
于 2010-09-25T11:30:49.710 回答
0

为了检索数据,您不需要使用 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 被插入到您的输出中。

于 2010-09-25T11:31:16.797 回答
0

nikic 所做的更常见的方式

foreach ($data as $key => $row){
  $data[$key]['text'] = nl2br($row['text']);
}

您确实覆盖了临时 $result 变量,而您必须将修改后的变量写回数组。并给我们的变量起合理的名称。
此外,如果它是用户提供的文本,请考虑使用 htmlspecialchars()。

于 2010-09-25T11:43:21.213 回答