0

テキストエリアから投稿された 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>";

私は3つのことをしました:

  • を取り外します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 に答える