確保您設置double_encode
到false
,否則已編碼字符串將被再次編碼,轉&
到&
。然後,當您在使用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。
在PHP中,你有一套字符串消毒功能和標記類型。這真的取決於你存儲的內容。如果你只存儲
的我會建議HTML實體和字符串消毒。至於XSS保護和過濾,我建議使用框架或庫。多年來,我在存儲HTML/XML時使用了代碼點火器XSS_clean類。作爲參考:http://php.net/manual/en/filter.filters.sanitize.php –