Php 在MySQL中存储HTML

Php 在MySQL中存储HTML,php,mysql,html-encode,Php,Mysql,Html Encode,我将HTML和文本数据以原始形式存储在数据库表中,但在正确输出时遇到了一个小问题。以下是表中存储的一些示例数据: <p>Professional Freelance PHP & MySQL developer based in Manchester. <br />Providing an unbeatable service at a competitive price.</p> 这会正确地输出数据,但是当我进行W3C验证程序检查时,它会说: cha

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

<p>Professional Freelance PHP & MySQL developer based in Manchester.
<br />Providing an unbeatable service at a competitive price.</p>
这会正确地输出数据,但是当我进行W3C验证程序检查时,它会说:

character "&" is the first character of a delimiter but occurred as data
因此,我尝试使用
htmleties
htmlspecialchars
,但这只会导致HMTL标记在页面上输出


正确的方法是什么?

htmlspecialchars
基本上是作为
htmlspecialchars
的超集,而
htmlspecialchars
也取代了
和code>

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

$row['details'] = preg_replace("/&(?![#0-9a-z]+;)/i", "&amp;", $row['details']);
这不是一个完美的解决方案,因为它对于以下字符串将失败:
someone&son
(带有尾随的
),但至少它不会破坏现有的HTML实体


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

使用
&
而不是
&

您要做的是使用php函数
htmlentities()

它会将您的输入转换为html实体,然后在输出时,它将被解释为html并作为该html的结果输出…
例如:

$mything = "<b>BOLD & BOLD</b>";
//normally would throw an error if not converted...
//lets convert!!
$mynewthing = htmlentities($mything);
$mything=“BOLD&BOLD”;
//如果不转换,通常会抛出错误。。。
//让我们皈依吧!!
$mynewthing=htmlentities($mything);

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

在我的项目中,我使用XSLT解析器,因此我必须将
更改为
 (例如)。但这是我找到的安全方法

这是我的密码

$html = trim(addslashes(htmlspecialchars(
        html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'),
        ENT_QUOTES, 'UTF-8'
    )));
当您从DB中读取数据时,不要忘记使用stripslashes()


我不知道这是否是一个好的建议,但如果我是你,我会忽略它。请确保验证器使用的规则正确/doctype-XML/XHTML不是HTML,并且unescaped&在该上下文中对HTML有效。但是,
&
将“始终是安全的”,应该是首选。解决此问题的最简单方法。不管怎样,数据是
HTML
。我想你是对的。。因为我存储的是HTML数据,所以存储HTML实体应该足够安全。这可能会破坏有效的HTML。考虑一个你有类似HTML的代码<…>的例子。amp,它将替换为
&;amp
是的,但我认为使用regex可以使它变得更好。现在,使用空格,当字符串类似于
Someone&son的
时,您会遇到问题。我用regexp表达式更新了我的答案。仍然有失败的情况,但要使其“完美”,实际上需要识别和跳过单个HTML实体。请随意改进或提供其他(非regexp)解决方案。因为他可以控制内容。实际的最佳解决方案是编写&as
&事先。这实际上是一个很好的HTML实践,因此没有理由不将HTML作为有效的存储在数据库中。(尽管HTML内容本身一开始可能不应该存储在数据库中,但情况不同)。
$html = trim(addslashes(htmlspecialchars(
        html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'),
        ENT_QUOTES, 'UTF-8'
    )));
$html = stripslashes($mysq_row['html']);