2016-05-30 91 views
1

我遇到了包含<br/>或&,<等字符串sting的問題。PHP MySQL如何正確存儲/轉義字符串

我逃避它像這之前我將它們存儲到數據庫

nl2br(htmlentities($string, ENT_QUOTES, 'UTF-8')); 

但是有些時候,當我顯示存儲結果我得到這樣的東西

&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;<br /><br /> 

有人可以幫助/告訴我當我想要將它顯示回屏幕上時,最好的方法是轉義字符串但保留斷點等等。

感謝您

+1

在PHP中,你有一套字符串消毒功能和標記類型。這真的取決於你存儲的內容。如果你只存儲
的我會建議HTML實體和字符串消毒。至於XSS保護和過濾,我建議使用框架或庫。多年來,我在存儲HTML/XML時使用了代碼點火器XSS_clean類。作爲參考:http://php.net/manual/en/filter.filters.sanitize.php –

回答

1

確保您設置double_encodefalse,否則已編碼字符串將被再次編碼,轉&amp;&amp;amp;。然後,當您在使用html_entity_decode之後去顯示它時,它將看起來好像仍然是編碼。

不希望的結果:http://ideone.com/uQxuAM


使用htmlentities($string, ENT_QUOTES, 'UTF-8', false);將確保這種情況不會發生。

然後使用html_entity_decode($string, ENT_QUOTES, 'UTF-8');來顯示值。

演示:http://ideone.com/8Jo7YA


然而,MySQL是完全能夠在數據庫中存儲的解碼值。

你永遠不希望有存儲在你的數據庫中的htmlentities編碼的字符串。當您想要生成CSV或PDF,發送電子郵件或任何不是HTML的內容時會發生什麼?

除了必須執行雙重編程數據編程,增加數據庫中的數據量之外,還需要解碼輸出,還有大量文章在線回答你爲什麼不應該這樣做。

所以你應該只需要編碼的值來顯示在HTML中產生的數據輸出。

相反,你應該逃避使用mysqli_real_escape_string

$string = '<a href="/path/to/file?a=b&foo=bar#baz">My Link</a>'; 
$sql = "INSERT INTO links (link)" 
    . "VALUES(" . mysqli_real_escape_string($string) . "')"; 

或者更好的輸入使用準備好的語句

$stmt = $mysqli->prepare("INSERT INTO links (link) VALUES(?)"); 
$stmt->bind_param("s", $string); 
$stmt->execute(); 

然後格式化輸出作爲一個成功的消息顯示什麼實際添加到數據庫中。

$html = "<div>Added Link: " . htmlentities($string, ENT_QUOTES, 'UTF-8', false) . "</div>"; 

現在沒有必要使用html_entity_decode來在瀏覽器中呈現HTML。

+0

謝謝我今天會試試這個,我接受了你的答案,因爲它提供了對我的問題的深入解釋和解決方案。 – IamCavic

1

html_entity_decode()可能做到這一點。

$string = '<a href="http://test.com>test</a><br/>test'; 
$encode = nl2br(htmlentities($string, ENT_QUOTES, 'UTF-8')); 

echo html_entity_decode($encode, ENT_QUOTES, 'UTF-8'); 

輸出原來$string

<a href="http://test.com>test</a><br/>test 

https://3v4l.org/qS5au

+0

謝謝您花時間幫助我。 +1但是我接受了另一個答案,因爲它提供了更詳細的解釋。 – IamCavic