2010-08-14 183 views
4

想象一下博客或cms系統(PHP和MySQL)。我想讓用戶在textarea中輸入一些文本並將其保存到數據庫中。數據庫中字段的類型是TEXT。將textarea保存到MySQL並保留換行符

我想保留換行符並稍後打印它們。我知道我可以用PHP的nl2br這個函數做到這一點,但是如何保護這個字符串免受SQL注入攻擊(讓我們假設我不能使用預處理語句)。如果我使用mysql_real_escape_string,它不會再顯示換行符。

$text = 'one line 
another line'; 
$text = mysql_real_escape_string($text); 
/* save to db, fetch it some time later */ 
echo nl2br($text); /* output: one line\r\nanotherline */ 
+0

不可能。嘗試一下,看看。輸出中不會有\ r \ n。 – 2010-08-14 10:04:33

回答

9

mysql_real_escape_string刪除換行符,它逃脫他們。

它應該工作沒關係存儲時,以及(與htmlspecialchars()可能結合,以防止用戶進入原始HTML)將nl2br當數據爲輸出逃脫的字符串。這是最好的方式。

+0

+1 Korrect Potter – 2010-08-14 10:00:24

-2

如果我使用mysql_real_escape_string,它不會再顯示換行符。

難道你沒有看到"\n"文字代替換行符嗎?
如果是這樣,你的代碼做了一些令人討厭的事情,很可能你會逃避你的數據兩次。
或者,你從數據庫獲取數據後不做mysql_real_escape_string()嗎?

無論如何,你必須做一些調試 - 調查,看看你的數據在每個階段會發生什麼。剛打印出$ _ POST [「textarea_name」],SQL查詢等
要見你失去了你休息的那一刻,並找出罪犯

注:
mysql_real_escape_string不保護任何攻擊任何東西。它逃脫了分隔符。
nl2br不保存任何東西。它爲換行符添加了一個HTML標籤。

0

mysqli_real_escape_string將用您的回車替換\r\n,因此您需要使用str_replace()取回回車。但是,它仍然不會在您的瀏覽器/電子郵件客戶端中可見。這就是nl2br()發揮作用:

$text = 'one line 
another line'; 
echo nl2br(str_replace("\\r\\n"," 
", mysqli_real_escape_string($dbc, $text))); 

的代碼測試,你可以使用它。