基本上在显示来自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) "&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;"。如果使用Web浏览器呈现&#039;,它将变为'。使用浏览器中的“查看源代码”菜单查看实际输出。

10-08 04:15