8

基本上在显示来自 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。

4

5 回答 5

11

你究竟是如何测试它的?

<?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;使用 Web 浏览器进行渲染,它将变为'. 使用浏览器中的“查看源代码”菜单查看实际输出。

于 2011-01-18T10:17:00.483 回答
4

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

于 2011-01-19T14:36:23.210 回答
1

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

于 2014-11-06T06:31:15.100 回答
1

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

function htmlsan($htmlsanitize){
    return htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
于 2011-01-18T10:04:42.383 回答
0

使用

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

或者

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

可能会做你想让他们做的事。

于 2011-01-18T10:25:30.470 回答