【问题标题】:PHP MySQL & vs & issue [duplicate]PHP MySQL&vs&问题[重复]
【发布时间】:2020-02-26 06:44:52
【问题描述】:

在数据库表中,列namevarchar(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”。他们将搜索与我的标题相似的内容。很酷的故事。

标签: php html


【解决方案1】:

使用此行查看相同的编码数据:

echo "OLD Name: " . htmlentities($row['name'], ENT_QUOTES) . "\n";

【讨论】:

    【解决方案2】:

    你应该使用 htmlentities 函数:

    $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: " . htmlentities($row['name'], ENT_QUOTES) . "\n";
            }
         }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2017-12-26
      • 1970-01-01
      • 2011-06-15
      • 2013-04-07
      相关资源
      最近更新 更多