Đảm bảo bạn đặt double_encode
thành false
, nếu không, các chuỗi đã được mã hóa sẽ được mã hóa lại, chuyển &
thành &
. Sau đó, khi bạn hiển thị nó sau khi sử dụng html_entity_decode
, nó sẽ xuất hiện như thể nó vẫn được mã hóa.
Kết quả không mong muốn: http://ideone.com/uQxuAM
Sử dụng htmlentities($string, ENT_QUOTES, 'UTF-8', false);
sẽ đảm bảo điều này sẽ không xảy ra.
Sau đó, sử dụng html_entity_decode($string, ENT_QUOTES, 'UTF-8');
để hiển thị giá trị.
Bản trình diễn: http://ideone.com/8Jo7YA
Tuy nhiên, MySQL hoàn toàn có khả năng lưu trữ các giá trị đã giải mã trong cơ sở dữ liệu.
Bạn không bao giờ muốn lưu trữ các chuỗi mã hóa htmlentities trong cơ sở dữ liệu của mình. Điều gì xảy ra khi bạn muốn tạo CSV hoặc PDF, gửi email hoặc bất kỳ thứ gì không phải là HTML?
Ngoài việc bạn phải thực hiện gấp đôi lập trình mã hóa dữ liệu, tăng lượng dữ liệu trong cơ sở dữ liệu, sau đó vẫn cần giải mã đầu ra, có rất nhiều bài báo trực tuyến giải đáp lý do tại sao bạn không nên làm vậy.
Vì vậy, bạn chỉ cần mã hóa các giá trị để hiển thị kết quả đầu ra dữ liệu trong html.
Thay vào đó, bạn nên thoát khỏi đầu vào bằng 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) . "')";
hoặc tốt hơn là sử dụng các báo cáo đã chuẩn bị sẵn
$stmt = $mysqli->prepare("INSERT INTO links (link) VALUES(?)");
$stmt->bind_param("s", $string);
$stmt->execute();
Sau đó, định dạng đầu ra dưới dạng thông báo thành công để hiển thị những gì đã thực sự được thêm vào cơ sở dữ liệu.
$html = "<div>Added Link: " . htmlentities($string, ENT_QUOTES, 'UTF-8', false) . "</div>";
Bây giờ không cần sử dụng html_entity_decode
để html được hiển thị trong trình duyệt.