我尝试构建包含图片和段落的帖子文章页面。
我的问题是我应该为图像和段落创建2个表吗?
或创建单个表并存储图像&一栏中的段落?
*(图片和段落将从上到下排序)
//文章表
id title
1 first post
//图像表(易于输出,但数据库将变得非常大)
id article_id src
1 1 abc.jpg
//段落表
id article_id text
1 1 this is first paragraph...
//文章表
id content
1 <p>feff.....</p><img... /><p>efefef</p><img.../>
答案 0 :(得分:1)
第一种方法的问题在于它没有订单概念。除非您按特定顺序只有一个图像和一个段落,否则无法保证正确的顺序。更好地处理此类任务的方法是使用articles
和article_contents
。
//文章
id, title
// article_contents
id, article_id, content_type, body, order
我想你也可能没有order
字段并且依赖于自动增量ID,但我认为最好对这些内容更明确。
因此,在渲染模板时,您可以执行类似的操作。 (这是所有伪代码)
<h1>
<?= $article->title; ?>
</h1>
<?php
foreach($article->content as $content) {
// this would be better as a class constant
if ($content->content_type === 'image') {
// have a class to handle rendering of images
echo \Content\Image::render($content->body);
}
if ($content->content_type === 'paragraph') {
// have a class to handle rendering of content, this output will likely need to be purified (see below)
echo \Content\Paragraph::render($content->body);
}
}
?>
你有很多方法可以做到。
您提到的其他选项确实存在问题,但您可以通过以下两种方式处理XSS问题。
基于评论的更新:
关于你的第一个评论,你不能依赖ID,如果这些ID在两个单独的表中,它可能会起作用,但它是一个非常脆弱的解决方案,不能提供我能想到的任何好处。
至于净化src标签,你只需要配置HTMLpurifier来验证src标签,从它的外观你可以用指令Core.RemoveInvalidImg
来做。 HTMLPuirifier内置了很多这些选项,功能非常强大。有关更多选项/文档,请参阅下面的链接。
https://github.com/GordonLesti/Lesti_Blog/tree/master/lib/HTMLPurifier/ConfigSchema/schema
http://htmlpurifier.org/docs/enduser-customize.html
进一步更新:
关于表现。这就是所谓的“一个好问题”。
选择文章时,您可以缓存生成的HTML并提供服务,当数据不经常更改时,无需费心数据库。
插入新文章时,您只需要等待并围绕它进行构建。您可以执行更新UI和异步更新数据库等操作。让用户知情,这是最重要的事情。
更新文章时,不要忘记使缓存无效。
最重要的是,这不是你现在需要考虑的问题。现在抛出一个缓存层,当你达到SO的大小时,你可以聘请专家来处理那种疯狂。请参阅下面的链接,这非常有趣。
http://nickcraver.com/blog/2013/11/22/what-it-takes-to-run-stack-overflow/