MySQL数据库中的HTML - 最佳实践

时间:2015-06-07 18:23:49

标签: html mysql

我开始创建一个系统,我(作为目前唯一的用户)将加载一个动态创建的PHP页面,其中包含<table>。然后,我将抓取<table>的HTML并将其保存以显示给网站的单独区域中的其他用户。

我的问题:这类事情要遵循哪些最佳做法?在MySQL中将HTML保存为TEXT或LONGTEXT? BLOB?甚至可以将这些数据保存为.txt文件,该文件使用PHP include()将其包含在向用户显示的文件中?

我不确定这种事情的最佳方法,因此也是一堆问题。我对创建数据库也不太熟悉,因此,我不了解他们的优点/缺点。 似乎就像使用MySQL数据库一样,这是可行的方法,但我并没有嫁给它。

注意#1:HTML 必须完整保留。因此<div>Let's use blue for this.</div>之类的内容最终无法以<div>Let\'s use blue for this.</div>形式出现。

注意#2:我保存的表每次都是随机生成的(包括行数/列数)。所以,我需要表格中的所有数据,包括所有<tr><td>'s

6 个答案:

答案 0 :(得分:5)

MySQL和HTML文件都可以工作。您的选择应取决于数据的简单程度以及存储的数量。

一些注意事项:

  1. <强>速度即可。 HTML文件和include()方法会更快。文件系统是最快,最简单的数据持久性形式。

  2. 横向可扩展性。如果采用文件系统方法,则或多或少地依赖于该计算机上的磁盘。使用单独的数据库引擎,您将来可以选择在网络上的不同群集服务器上运行数据库。

  3. 元数据。您是否需要存储创建时间,用户创建HTML,其他用户查看了多少次?如果是这样,你可能只有一个现实的选择 - 一个“适当的”数据库。这可以是MySQL,也可能是NoSQL解决方案之一。

  4. 数据消费。您是否将表格完整地显示给其他用户?或者你展示它的选定部分?可能甚至是不同用户的不同部分?这会影响您存储数据的方式 - 整个表格作为一个实体,或每一行作为一个实体,或每个单独的单元格。

  5. TEXT或LONGTEXT?当然只有在使用SQL时才适用。回答这个问题的唯一方法是知道每个“HTML片段”要存储多少字节。请注意,您的字符编码也会影响存储的字节数。请参阅:TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT maximum storage sizes

  6. 另请注意,在MySQL中,每个TEXT / LONGTEXT也可能导致磁盘的I / O.

    至于关注:

      

    必须完整保留HTML。

    只要你不在任何时候逃避HTML,你应该没事。乍一看,这违反了安全性最佳实践,但如果您考虑一下,“不逃避HTML”正是您想要做的。转义HTML输出的做法只有助于消除HTML语法被解析为HTML标记(潜在的恶意),但在您的情况下,您根本不希望消除HTML语法 - 您有意将<td>解析为一个实际的HTML表格单元格。所以不要逃避任何事情,你给出的例子永远不会发生。

    请注意:虽然您没有HTML转义输出,但您仍应过滤您的输入。实质上,这意味着:在写入数据库之前,请检查用户输入是否确实是HTML。为了增强应用程序的安全性,为这些表格单元格中存储的内容定义规则也是明智的 - 可能不允许<iframe><a>,不允许style属性等。另外注意SQL注入 - 如果你要使用PHP + MySQL,请使用PDO和准备语句。

答案 1 :(得分:1)

遵守此规则: PHP用于格式化; MySQL用于数据。

PHP用于构建HTML。 MySQL可用作PHP可以构建HTML的数据的持久存储。

我用Apache + PHP + MySQL构建了几个系统。每个页面都是PHP生成的HTML。我不在MySQL中存储<html tags>,只存储数据。

我的部分网页会执行一个SELECT;许多页面执行十几个或更多。表现很好。我使用PHP子例程来构建<table>s。我根据数据构建了样式变体。

Let's use blue for this可能在某个数据库表中; PHP代码会在其周围添加<div>标记。

答案 2 :(得分:1)

有人会想出正确执行此操作的PHP,但这是一个想法。

  1. 学习数据库是一项单独的练习,不应该与学习其他任何东西混在一起。让MySQL离开这个。如果你想回去并用它作为学习练习重做项目,在你花了一些时间学习基础知识之后,请继续。
  2. 您要做的是将表生成为一个单独的.php片段,然后以一个唯一的名称将其保存到磁盘,以后可以用它来重新找到它(可能是一个日期/时间,也许是一个不断增加的数字,也许是一种不同的方式)。保存后,您可以将其包含在您的页面以及要包含它的其他页面中。获得这个独特的名字可能是一个挑战,但这是一个不同的问题(如果你环顾四周,可能已经在某处有答案)。
  3. 如果你足够了解.php,其余部分应该是自我解释的。如果你不这样做,那么现在是学习的好时机。如果您还有其他问题,可以搜索堆栈溢出或谷歌搜索答案。机会是,答案就在那里。
  4. 由于我确实知道数据库,因此可能会有一个有趣的讨论,其他海报试图与您讨论如何存储数据。但是,一旦您理解了我们想要讨论的内容,那么这个讨论对您来说真的很有用。此外,我敢打赌它至少已被问过一次。
  5. 所以试试这个计划然后回来发布你是如何为未来的读者做的。快乐的编码。

答案 3 :(得分:1)

你想要做的事情绝对不是像Rick James这样的三层架构,你在混合数据和演示。 但就像在所有事情中一样,这取决于你想做什么和你的策略。

  • 假设您希望构建一个具有特定页面模型的应用程序,该页面具有特定空间,用于在此处具有特定数据的图像,并且您希望多年保持相同的体系结构,则应将数据和表示分开。大多数时候,大公司,大型应用程序正在寻找这个approch。即使我知道一些大公司的应用程序,我们也在数据库中存储了一些HTML代码。
  • 现在,如果您想快速更改每个页面设计,可以在数据库中使用HTML标记。 例如,Wordpress在其表中有很多HTML标签多年,它仍然被很多人维护和使用。在数据库中保存HTML?根据你的需求/策略,它不会让我感到震惊。

  • 为了您的信息,在Wordpress中,HTML帖子保存为LONGTEXT。

  • 在这种方法中,像Wordpress一样,你不会有一个强大的数据库模型,它会很混乱而且不是真正的关系。

^^

答案 4 :(得分:-1)

我建议将你的表视为一种对象。 SQL表用于存储关系数据。因此,为什么不以那种方式代表桌子呢?下面是如何在SQL中存储People数据表的一个非常基本的示例。

<table>
<thead>
    <th>People ID</th>
    <th>First Name</th>
    <th>Last Name</th>
</thead>
<tbody>
    <tr>
        <td>1</td>
        <td>John</td>
        <td>Doe</td>
    </tr>
    <tr>
        <td>2</td>
        <td>Jane</td>
        <td>Doe</td>
    </tr>
</tbody>

然后你的SQL表将存储加密的字符串,如下所示(使用JS):

function utf8_to_b64( str ) {
  return window.btoa(unescape(encodeURIComponent( str )));
}

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

var my_table = $('#table').html();

// Store this
var encrypted_string = utf8_to_b64(my_table);

// Decode as so
var table = b64_to_utf8(encrypted_string);

从此处检索B64编码:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding

答案 5 :(得分:-2)

我不知道您打算存储多少个表,但如果您不需要进行排序或过滤等复杂操作,则可以将它们存储在文件夹结构中的文件中,这将比MySQL和整个文件都被保留了。

如果你需要很多表,那么就不要存储HTML表,用这样的信息存储一个json:

[
    [
    { 
      "content": "Let's use blue for this.",
      "color": "blue"
    },
    { 
      "content": "Let's use red for this.",
      "color": "red"
    }
    ],
    [
     { 
      "content": "Another row.",
      "color": "blue"
    },
     { 
      "content": "Another row.",
      "color": "red"
    }
  ]
]

然后在调用它时重建它。将使用更少的空间,并将更快地转移。

如果您的表格是固定格式,请创建一个包含所需字段的表格。