【发布时间】:2020-02-26 06:44:52
【问题描述】:
在数据库表中,列name为varchar(255)
列编码:utf8_unicode_ci
列中的示例值:Garner Heating & Cooling
当我查询这个值时,使用:
$conn = new mysqli($host, $user, $pw, $db);
$sql = "SELECT id,name FROM bizs WHERE name = 'Garner Heating & Cooling'";
if ($result = $conn->query($sql)) {
if ($conn->affected_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "OLD Name: " . $row['name'] . "\n";
}
}
}
输出:
OLD Name: Garner Heating & Cooling
为什么& 被转换为&?
【问题讨论】:
-
您正在浏览器中查看它。实体在浏览器中显示为它们正在编码的字符,如果您需要实体,请进行双重编码。 php.net/manual/en/function.htmlentities.php 理想情况下,您的数据库将具有
&,并且您的编码仅用于输出。 -
谢谢你...正在尝试将 Table 中的值更新为解码实体,所以 $name = htmlspecialchars_decode($row'name');成功了,并且将双重编码以在浏览器中看到它!
-
它被称为 XSS。你应该看看如何防止它。
-
XSS 不适用于这个“一次性使用”清理脚本(我自己),因为数据在 db UPDATE 之前正确转义,没有用户输入,在不面对的服务器上公共互联网。将此问题标记为重复是不正确的,因为遇到此问题的任何人都不会在 Google 上搜索“XSS”。他们将搜索与我的标题相似的内容。很酷的故事。