我开始创建一个系统,我(作为目前唯一的用户)将加载一个动态创建的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
。
答案 0 :(得分:5)
MySQL和HTML文件都可以工作。您的选择应取决于数据的简单程度以及存储的数量。
一些注意事项:
<强>速度即可。 HTML文件和include()
方法会更快。文件系统是最快,最简单的数据持久性形式。
横向可扩展性。如果采用文件系统方法,则或多或少地依赖于该计算机上的磁盘。使用单独的数据库引擎,您将来可以选择在网络上的不同群集服务器上运行数据库。
元数据。您是否需要存储创建时间,用户创建HTML,其他用户查看了多少次?如果是这样,你可能只有一个现实的选择 - 一个“适当的”数据库。这可以是MySQL,也可能是NoSQL解决方案之一。
数据消费。您是否将表格完整地显示给其他用户?或者你展示它的选定部分?可能甚至是不同用户的不同部分?这会影响您存储数据的方式 - 整个表格作为一个实体,或每一行作为一个实体,或每个单独的单元格。
TEXT或LONGTEXT?当然只有在使用SQL时才适用。回答这个问题的唯一方法是知道每个“HTML片段”要存储多少字节。请注意,您的字符编码也会影响存储的字节数。请参阅:TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT maximum storage sizes
另请注意,在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,但这是一个想法。
所以试试这个计划然后回来发布你是如何为未来的读者做的。快乐的编码。
答案 3 :(得分:1)
你想要做的事情绝对不是像Rick James这样的三层架构,你在混合数据和演示。 但就像在所有事情中一样,这取决于你想做什么和你的策略。
现在,如果您想快速更改每个页面设计,可以在数据库中使用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"
}
]
]
然后在调用它时重建它。将使用更少的空间,并将更快地转移。
如果您的表格是固定格式,请创建一个包含所需字段的表格。