数据库中的HTML标签是一种好的实践还是坏的实践?

5
有时我需要格式化来自数据库的特定数据或其中的一部分。
例如:
如果我有一个像这样的描述(存储在数据库中):
HTML 4已经被调整,扩展和增强,超出了其最初的范围,以为网站带来高水平的互动和多媒体。像Flash,Silverlight和Java这样的插件已经将媒体集成到Web中,但并非没有代价。
我想要格式化最后一行,例如更改字体和颜色。
那么最佳实践是什么?
在我的数据库中嵌入HTML标记?这是安全且最佳的实践吗?还是有一些方法可以将结构层与表现层和行为层分开?

1
顺便提一下 - 我必须说,将其存储在数据库中要难以维护得多。 - Induster
7个回答

6
如果您计划操作或搜索存储的数据,则不要在数据库中存储HTML标记。想象一下,在某些时候,您被要求将字体从Tahoma更改为Georgia,将标签更改为标签,或允许用户搜索HTML列;并且搜索strong会返回无关信息,因为< strong>也是经常使用的HTML标记之一。
如果您不检查正在存储的内容,则在数据库中存储HTML标记也是一个坏主意。恶意脚本标记(例如)只是其中一个简单的例子。
理想情况下,您应该按原样存储数据或使用某种标记(如wiki或markdown)来存储基本格式信息。

5

有一种方法可以将数据与展示分离开来。你需要将它们分开!如果你想对从数据库中提出来的文本进行格式化,可以在应用程序代码中进行操作。注意,结构标记和展示标记(字体、颜色、布局等)是完全不同的主题。

http://en.wikipedia.org/wiki/Separation_of_presentation_and_content 讨论了这个问题,并在“预期含义”段落中清晰地区分了结构标记和展示标记。

将格式化标签存储在数据中通常表明两个层次之间的分离不足或数据模型不足以正确表示您的数据。由于作者正在将数据存储在数据库中,这可能表明他只有一个字段来保存文章的“内容块”,而不是多个字段来保存作者、标题、正文、参考文献等。对于用户输入数据,我们经常使用标记语言来指定结构。这通过“虚假”HTML标签或甚至真正的HTML/XML标签(如<h1><em><a>等)来实现。

请注意,我并不反对基于结构的标记原则,但如果您将其存储在数据库中,则需要仔细考虑其所需原因。我原则上反对基于表现的标记。

我应该因为在这个评论中没有将“数据”与“呈现”分开而受到惩罚吗? - penartur
可爱。只是为了防止有人误解你是认真的...作者问题和这个评论之间的主要区别在于,作者具有将数据与呈现分离所需的控制权。这可能需要稍微重构数据模型,以使数据类型更易于区分(标记指示结构很常见,根据目的将数据分成多个字段也很常见),而您无法在评论中这样做。但请注意,结构化标记不是呈现。 - gfortune
颜色纯粹是表现形式。 “部分文本”是结构性的。 - gfortune
在我的第一条评论中,我改变了文本的一部分的字重,这是否是结构性的? - penartur
你想要更改的文本部分(例如,“我想让标题变大一点”)是结构性指定。我们对标题所做的更改(使其变大)是表现形式。在HTML方面,这就是<h1><h1 style='font.....'><font>之间的区别。 - gfortune
显示剩余7条评论

2

这取决于数据从哪里进入数据库。

如果只有您更改数据库内容,则将HTML标签存储其中是完全正常的。

否则,如果您将用户输入存储在数据库中,则有两种方法:

1)对用户提供的输入进行清理(无论是在存储还是在显示时),以确保不会显示任何恶意数据。

2)使用一些中间标记语言(例如BBCode)进行编译为HTML(同样是在存储或显示时)。


2
我不建议将任何HTML标签存储在数据库中。最终,当您的代码库变得更大,或者您想要更改HTML时,您会发现自己陷入困境。例如,如果要向HTML标签添加一些参数(如类别等),则需要使用SQL语句“修复”所有HTML标签。这也适用于您想要对数据进行其他处理的情况。例如,创建RSS Feeds或将其导出到另一种格式,如Excel表格或类似格式。
你为什么想这样做呢?我相信有更好的解决方案来解决你的问题。尝试将内容与应用程序层分离。规范化您的数据,并将段落放入新的数据集中。如果您确实需要对某个词进行着色,我建议按照已发布的建议使用自己的语法,如[color-a] [/color-a]。但是,可以通过striptags()解决导出问题。

不要使用[color-a][/color-a],最好使用[title][/title]或[footer][/footer]或[phone][/phone]等。这样,您可以决定页脚、电话或标题应该具有什么颜色/大小/布局,结构标签为内容提供了额外的含义。当然,前提是将此内容拆分为数据库中的单独字段不是更好的选择。 - gfortune

1

您可以使用Blob字段,但是如果我没记错的话,您将无法对其进行完全搜索。如果您有一个以模板名称为值的列和一个包含HTML模板值的Blob,则这将非常有效。


1

在我的看法中,将HTML存储在数据库中是完全可以的。你听起来很聪明,不会允许未经验证的内容进入数据库。

但你需要小心更新方式。如果你通过代码向数据库插入数据:

INSERT INTO myTable Values(x + y + z)

如果变量x中包含一些带有单引号的HTML,那就不好了。


1

我认为你在数据库中存储的字符串内容与展示层无关,其唯一影响是你的业务层如何向展示层提供html字符串(直接从数据库中读取或稍后进行装饰)。


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