【问题标题】:Storing HTML in MySQL在 MySQL 中存储 HTML
【发布时间】:2023-03-13 18:43:01
【问题描述】:

我将 HTML 和文本数据以其原始形式存储在我的数据库表中 - 但是我在让它正确输出时遇到了一个小问题。以下是按原样存储在表中的一些示例数据:

<p>Professional Freelance PHP & MySQL developer based in Manchester.
<br />Providing an unbeatable service at a competitive price.</p>

要输出这些数据,我会这样做:

echo $row['details'];

这会正确输出数据,但是当我进行 W3C 验证器检查时,它会显示:

character "&" is the first character of a delimiter but occurred as data

所以我尝试使用 htmlemtitieshtmlspecialchars 但这只会导致 HMTL 标签在页面上输出。

这样做的正确方法是什么?

【问题讨论】:

  • 我不知道这是否是一个好建议,但如果我是你,我会忽略它
  • 确保验证器使用正确的规则/文档类型 - XML/XHTML 不是 HTML,并且在 HTML 的上下文中未转义的 & 是 有效。然而,&amp;amp; 将“永远是安全的”并且应该是首选。

标签: php mysql html-encode


【解决方案1】:

使用&amp;amp; 代替&amp;

【讨论】:

  • 解决此问题的最简单方法。无论如何,数据是HTML
  • 我认为你是对的。因为我正在存储 HTML 数据,所以存储 HTML 实体应该足够安全。
【解决方案2】:

你要做的是使用php函数htmlentities()...
它会将您的输入转换为 html 实体,然后在输出时将其解释为 HTML 并作为该 HTML 的结果输出...
例如:

$mything = "<b>BOLD & BOLD</b>";
//normally would throw an error if not converted...
//lets convert!!
$mynewthing = htmlentities($mything);

现在,只需将$mynewthing 插入您的数据库!

【讨论】:

    【解决方案3】:

    htmlentities 基本上是htmlspecialchars 的超集,htmlspecialchars 也替换了&lt;&gt;

    实际上,您要做的是修复无效的 HTML 代码,我认为这需要一个临时解决方案:

    $row['details'] = preg_replace("/&(?![#0-9a-z]+;)/i", "&amp;", $row['details']);
    

    这不是一个完美的解决方案,因为它会因以下字符串而失败:someone&amp;son;(带有尾随 ;),但至少它不会破坏现有的 HTML 实体。

    但是,如果您对数据的存储方式有决定权,请确保存储在数据库中的 HTML 代码是正确的。

    【讨论】:

    • 这可能会破坏有效的 html。考虑一个例子,你有像... &amp;amp;amp; ...这样的有效html,它会用... &amp;amp;amp; ...替换它
    • 是的,但我认为使用正则表达式可以做得更好。
    • 现在,有了空格,当字符串类似于 Someone&amp;son's
    • 我用正则表达式更新了我的答案。在某些情况下它会失败,但要使其“完美”需要实际识别和跳过单个 HTML 实体。随意改进或提供替代(非正则表达式)解决方案。
    • 因为他可以控制内容。实际的最佳解决方案是事先将 & 写为&amp;amp;。一般来说,这实际上是 HTML 的一个很好的做法,因此没有理由不应该将 HTML 存储在数据库中作为开始时的有效内容。 (尽管 HTML 内容本身可能一开始就不应该存储在数据库中,但那是另一回事)。
    【解决方案4】:

    在我的项目中,我使用 XSLT Parser,因此我不得不将 &amp;nbsp; 更改为 &amp;#160;(例如)。但这是我发现的安全方式...

    这是我的代码

    $html = trim(addslashes(htmlspecialchars(
            html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'),
            ENT_QUOTES, 'UTF-8'
        )));
    

    当你从 DB 中读取数据时,别忘了使用 stripslashes();

    $html = stripslashes($mysq_row['html']);
    

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2013-03-30
      • 2019-06-05
      相关资源
      最近更新 更多