htmlspecialchars & ENT_QUOTES не работает? - PullRequest
5 голосов
/ 18 января 2011

В основном при отображении данных из базы данных MySQL у меня есть функция htmlspecialchars() ниже, которая должна преобразовывать одинарные и двойные кавычки в их безопасные объекты. У меня проблема с просмотром исходного кода, он конвертирует < > & только тогда, когда он мне также нужен для преобразования одинарных и двойных кавычек.

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

Затем, когда я хочу использовать, например, я делаю:

htmlsan($row['comment']);

Может кто-нибудь сказать мне, почему он не конвертирует одинарные и двойные кавычки?

UPDATE

Что странно, htmlsan() используется для комментариев в электронной почте, и когда я просматриваю исходный код электронной почты, он преобразует их, кажется, что он не будет преобразовывать одинарные / двойные кавычки из базы данных при отображении на веб-странице. Для моей сортировки базы данных также установлено utf8_general_ci, и я заявляю, что использую utf8 для соединения с базой данных и т. Д.

Ответы [ 5 ]

7 голосов
/ 18 января 2011

Как вы это точно тестируете?

<?php

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

var_dump(htmlsan('<>\'"'));

... печатает:

string(20) "&lt;&gt;&#039;&quot;"

Я предполагаю, что ваша входная строка происходит из Microsoft Word и содержит типографские кавычки:

var_dump(htmlsan('“foo”')); // string(9) "“foo”" 

Если вам нужно конвертировать их по какой-либо причине, вам нужно htmlentities() вместо htmlspecialchars():

var_dump(htmlentities('“foo”', ENT_QUOTES, 'UTF-8')); // string(17) "&ldquo;foo&rdquo;"

Обновление # 1

ХорошоПришло время для надлежащего тестирования.Введите одинарную кавычку (') в поле comment базы данных и запустите следующий код, когда получите его:

var_dump(bin2hex("'"));
var_dump(htmlspecialchars("'", ENT_QUOTES, 'UTF-8'));
var_dump(bin2hex($row['comment']));
var_dump(htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'));

Он должен напечатать это:

string(2) "27"
string(6) "&#039;"
string(2) "27"
string(6) "&#039;"

Пожалуйстаобновите свой вопрос и подтвердите, выполнили ли вы этот тест и получили тот же или другой вывод.

Update # 2

Пожалуйста, внимательно посмотрите на вывод, который, по вашему мнению, вы получаете:

string(6) "'"

Это , а не строка из 6 символов.Вы не смотрите на вывод real : вы смотрите на вывод как , визуализированный браузером.Я уверен, что вы получите ожидаемый результат, то есть string(6) "&#039;".Если вы визуализируете &#039; с помощью веб-браузера, оно становится '.Используйте View Source меню в вашем браузере, чтобы увидеть реальный результат.

3 голосов
/ 19 января 2011

Когда вы просматриваете исходный код с помощью Firebug, Firebug показывает его так, как его отображает веб-браузер, я думал, что он показал бы исходный код так же, как если бы вы пошли в View Source в строке меню браузера.Головная боль выучена и запомнится.Спасибо всем за ваше драгоценное время и вклад.

1 голос
/ 06 ноября 2014

Была такая же проблема.Моя база данных с utf-8_unicode_ci и моим html charset utf-8, и htmlentities конвертировал только все, кроме кавычекЯ думал, что одинаковая кодировка в db и html будет работать нормально, но это не так.Поэтому я изменил кодировку в html на iso-8859-1, и это сработало.Я не знаю почему, но это сработало.Мой БД все еще с utf-8_unicode_ci.

0 голосов
/ 18 января 2011

Использование

htmlentities($htmlsin, ENT_QUOTES, 'UTF-8');

или

mb_convert_encoding($htmlsan, "HTML-ENTITIES", "UTF-8");

Вероятно, будет делать то, что вы хотите, чтобы они.

0 голосов
/ 18 января 2011

Не уверен, будет ли это иметь какое-либо значение, но вы пытались удалить $htmlsanitize.

function htmlsan($htmlsanitize){
    return htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
...