mysql创建帖子和存储图像&单个表或多个表中的段落

时间:2016-11-23 10:39:33

标签: php mysql

我尝试构建包含图片和段落的帖子文章页面。

我的问题是我应该为图像和段落创建2个表吗?

或创建单个表并存储图像&一栏中的段落?

*(图片和段落将从上到下排序)

1。多表

//文章表

id title
1  first post

//图像表(易于输出,但数据库将变得非常大)

id article_id src
1  1          abc.jpg

//段落表

id article_id text
1  1          this is first paragraph...

2。单表(db内存标签,输出会有xss问题)

//文章表

id  content
1  <p>feff.....</p><img... /><p>efefef</p><img.../>

1 个答案:

答案 0 :(得分:1)

第一种方法的问题在于它没有订单概念。除非您按特定顺序只有一个图像和一个段落,否则无法保证正确的顺序。更好地处理此类任务的方法是使用articlesarticle_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问题。

  1. htmlentities()但你失去了所有的格式()。
  2. HTML Purifier,这将允许您将某些标签列入白名单,如粗体,斜体和段落。您也可能需要为第一个解决方案执行此操作,因为在没有任何格式化的情况下阅读文章非常糟糕。
  3. 基于评论的更新:

    关于你的第一个评论,你不能依赖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/