htmlspecialchars& ENT_QUOTES无效?

时间:2011-01-18 10:01:29

标签: php htmlspecialchars

基本上在显示来自MySQL数据库的数据时,我有一个htmlspecialchars()函数,它应该将单引号和双引号转换为它们的安全实体。我遇到的问题是查看源代码,当我还需要转换单引号和双引号时,它只转换< > &

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

然后当我想用我做的时候:

htmlsan($row['comment']);

有人可以告诉我为什么它不会转换单引号和双引号吗?

更新

奇怪的是htmlsan()用于电子邮件中的评论,当我查看电子邮件的源代码时,它会转换它们,似乎它不会在网页上显示时转换数据库中的单/双引号。我的数据库排序规则也设置为utf8_general_ci,我声明我在数据库连接上使用utf8等。

5 个答案:

答案 0 :(得分:7)

你是如何准确测试它的?

<?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;"

请更新您的问题并确认您是否运行此测试并获得相同或不同的输出。

更新#2

请仔细查看您声称获得的输出:

string(6) "'"

那是不是一个包含6个字符的字符串。您没有查看真实输出:您正在通过浏览器将输出视为呈现。我很确定你得到了预期的结果,即string(6) "&#039;"。如果您使用网络浏览器呈现&#039;,它将变为'。使用浏览器中的查看源菜单查看实际输出。

答案 1 :(得分:3)

当您使用Firebug查看源代码时,Firebug会像Web浏览器一样显示它,我认为它会显示源代码,就像您在浏览器菜单栏中查看源代码一样。头痛得知并将被记住。感谢大家宝贵的时间和投入。

答案 2 :(得分:1)

有同样的问题。我的数据库是使用utf-8_unicode_ci和我的html charset utf-8,而htmlentities只转换了除引号之外的所有内容。我认为在db和html中使用相同的字符集可以正常工作,但事实并非如此。所以我将html上的charset更改为iso-8859-1并且它有效。我不知道为什么,但它有效。我的数据库仍然使用utf-8_unicode_ci。

答案 3 :(得分:0)

不确定这是否会有所不同,但您是否尝试删除$htmlsanitize

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

答案 4 :(得分:0)

使用

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

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

可能会做你想要的。