基本上在显示来自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。 最佳答案
您如何进行精确测试?
<?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) "<>'""
我的猜测是您的输入字符串来自Microsoft Word,并包含打印引号:
var_dump(htmlsan('“foo”')); // string(9) "“foo”"
如果确实出于任何原因需要转换它们,则需要
htmlentities()
而不是htmlspecialchars()
:var_dump(htmlentities('“foo”', ENT_QUOTES, 'UTF-8')); // string(17) "“foo”"
更新#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) "'"
string(2) "27"
string(6) "'"
请更新您的问题,并确认您是否运行了此测试并获得了相同或不同的输出。
更新#2
请仔细查看您声称获得的输出:
string(6) "'"
这不是一个包含6个字符的字符串。您不是在查看实际的输出:而是在将浏览器的呈现为的输出作为输出。我很确定您得到了预期的结果,即
string(6) "'"
。如果使用Web浏览器呈现'
,它将变为'
。使用浏览器中的“查看源代码”菜单查看实际输出。