PHP如何将HTML字符串保存到数据库?

6
作为对API调用的响应,我得到了一个完整的HTML脚本,这里的“完整”指包含HTML、CSS和Javascript。现在我把这个HTML以字符串的形式存储在PHP变量中。
$content = '<html>
<head>
  <script>--Some javascript and libraries included--</script>
  <title></title>
</head>
<body>
   <style>--Some Styling--</style>
</body>
</html>';

现在,将这个变量保存到数据库中最好的方式是什么?如何实现?
  • 作为具有VARCHAR或TEXT类型的字符串?
  • 作为Base64编码的字符串,具有VARCHAR或TEXT类型?
  • 作为具有BLOB类型的二进制文件?

还是您想建议其他方式(可能是序列化或打包)?


在wp中,它们使用 addslashes(deslash($content));。 deslash函数是由wp核心编写的,目的是使其通用化并存储在WordPress数据库中。它有助于工作。 - Kvvaradha
我希望你的用户无法访问这些HTML数据,否则你会暴露于XSS攻击之中。 - Bobby Axe
6个回答

16

我使用Base64编码的数据,存储在我的数据库中,数据类型为BLOB。以下是样板代码:

$content = '<html>
<head>
  <script>--Some javascript and libraries included--</script>
  <title></title>
</head>
<body>
   <style>--Some Styling--</style>
</body>
</html>';

将数据编码为base64格式

$encodedContent = base64_encode($content); // This will Encode

并将数据保存到带有BLOB的数据库中。现在,在检索数据后,只需按照以下方式解码即可。

$ContentDecoded = base64_decode($content);  // decode the base64

现在$contentDecoded的值是普通的HTML。


我也想了解关于踩票的情况。为什么人们会在不指出错误的情况下进行踩票? - saiid
2
@e4c5说过:你可以通过这种方式增加存储大小。 - IceFire

6
如果你使用base64编码,存储大小会增加大约30%,每次显示时都需要解码。看看WordPress的表结构,这是最广泛使用的使用php将html存储在mysql数据库中的软件。他们使用什么?LONGTEXT。在你的情况下,TEXT可能更好,因为你可能已经对页面的大小有一个很好的想法。

谢谢@e4c5,我会看一下的。你提供的链接更像是一般形式。但是,我会看一下WP如何处理这个问题。 - saiid
不,那只是一个例子,不需要深入挖掘。只需使用TEXT,但不要费心进行base64编码。 - e4c5
如果 HTML 不在我们的控制范围内怎么办?例如,如果我从互联网上获取了一个随机站点,我应该在存储之前对其进行编码吗?这样做有助于防止潜在的 SQL 注入吗? @e4c5 - stan0
你应该使用预处理语句来避免 SQL 注入。首先,永远不要允许超出你的控制范围的 HTML 被保存到数据库中,否则将会让你完全暴露给 XSS 攻击。 - e4c5

4
使用addslashes()函数将HTML存储到变量中。
$html = addslashes('<div id="intro">
<div id="about" align="left">
<h2 class="bigHeader" dir="rtl"HEADER</h2>
<img src="img/Med-logo.png" alt="" />
<div id="wellcomePage" class="text-left text" dir="rtl">
<p>...some words....</p>
<p>.some words....</p>
<p>&nbsp;</p>
</div>
</div>
</div>');

在此之后,形成一个SQL查询。
$sql = "UPDATE `Pages` SET `content`= '".$html."'";

当你从数据库中检索数据时,你需要添加stripslashes函数。


1
你可以使用base64_encode将字符串编码,并将其存储到文本/ blob类型的字段中。

是的...在显示时,您需要对该字符串进行解码。 - Jignesh Patel
不需要使用base64进行编码/解码,因为BLOB可以容纳任何类型的数据。而且编码/解码会占用CPU和内存。 - e4c5

1
我建议您使用TEXT。Blob通常用于存储图像、音频或其他多媒体对象。了解更多关于bolobs的信息。
在数据库中存储HTML的数据类型应该是TEXT
使用mysql_real_escape_string()将HTML文本存储到数据库中。
$content = '<html>
<head>
  <script>--Some javascript and libraries included--</script>
  <title></title>
</head>
<body>
   <style>--Some Styling--</style>
</body>
</html>';

$html = mysql_real_escape_string($content);

1
谢谢@Manjeet,但是你建议的函数mysql_real_escape_string已经过时了。我还看到了这个**htmlspecialchars()**函数,但是在数据库中存储大型HTML文档是否安全呢?因为我从未在数据库中看到过纯HTML。 - saiid

0

看这个:我什么也没做...

我像这样使用它...工作得很好,还可以保存在mysql中,并且正确地检索回来。

    $editorContent = $_POST['textarea'];
    
    $a = $editorContent;
    
    $insert = $db->query("INSERT INTO psd ( psdata) VALUES ( '$a')" );

这只是获取文本区域的值,而不包括任何特殊的HTML标签。<textarea>标签本身不会进入数据库...如果您在内容中混合了其他标签,例如<em><strong>等,则无法保存它们。 - Dut A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接