htmlspecialchars&ENT_QUOTES不工作?

PHP*_*VER 5 php htmlspecialchars

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

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

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

htmlsan($row['comment']);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

Álv*_*lez 8

你是如何准确测试它的?

<?php

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

var_dump(htmlsan('<>\'"'));
Run Code Online (Sandbox Code Playgroud)

...打印:

string(20) "&lt;&gt;&#039;&quot;"
Run Code Online (Sandbox Code Playgroud)

我的猜测是你的输入字符串来自Microsoft Word并包含印刷引号:

var_dump(htmlsan('“foo”')); // string(9) "“foo”" 
Run Code Online (Sandbox Code Playgroud)

如果您确实需要根据原因进行转换,则需要htmlentities()而不是htmlspecialchars():

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

更新#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'));
Run Code Online (Sandbox Code Playgroud)

它应该打印这个:

string(2) "27"
string(6) "&#039;"
string(2) "27"
string(6) "&#039;"
Run Code Online (Sandbox Code Playgroud)

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

更新#2

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

string(6) "'"
Run Code Online (Sandbox Code Playgroud)

不是一个包含6个字符的字符串.您没有查看实际输出:您正在查看浏览器呈现的输出.我很确定你得到了预期的结果,即string(6) "&#039;".如果&#039;使用Web浏览器进行渲染,则会变为'.使用浏览器中的" 查看源"菜单查看实际输出.


Mat*_*den 1

不确定这是否会产生任何影响,但您是否尝试过删除$htmlsanitize.

function htmlsan($htmlsanitize){
    return htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
Run Code Online (Sandbox Code Playgroud)