论坛软件应该在审核时删除主题/帖子还是简单地隐藏?

时间:2012-03-09 22:55:05

标签: mysql

只是好奇地看到你的意见,因为我正在和一个共存的CMS一起开发一个论坛脚本 - 我有ACL等等。

但是想知道是否最好做DELETE FROM ...(如删除记录)...或者只需UPDATE将列设置为1({{1} }) - 隐藏它(所以它看起来被删除)。

PS:只有我信任的人才能访问审核工具

2 个答案:

答案 0 :(得分:3)

这取决于您,通常是您要删除的数据有多重要,或者您希望对事故有多宽容的问题。

我喜欢使用的方法是为您要删除的项目提供克隆数据库。在删除时,将所选行的内容复制到新数据库,然后删除。额外"删除"系统中的文章或项目只是占用更多空间,最终会减慢查询速度。(可能)。

填写完"删除文章"数据库,运行转储,存档,截断。

假设您的数据库CMS上有一个名为ARTICLES的表,您希望存储已删除的帖子,我们将创建一个具有相同表结构的相同数据库:

CREATE DATABASE `deleted`;
CREATE TABLE deleted.cmsarticles LIKE CMS.ARTICLES;

在删除内容的PHP脚本中,您可以执行以下操作:

//GRAB THE ID OF THE ARTICLE YOU ARE DELETING, MAKE SURE TO SANITIZE!
$article_id=$_POST['id'];
if(is_numeric($article_id) {
    $dbconnect=databaseFunction();
    $result=$dbconnect->query("SELECT `row1`,`row2` FROM `ARTICLES` WHERE `id`=$article_id");
    if($result->num_rows!=0) {
        $row=$result->fetch_array(MYSQLI_ASSOC);
        //Open new connection to deleted database
        $dbconnect2=otherDBFunction();
        $dbconnect2->query("INSERT INTO `cmsarticles`(row1,row2) VALUES ({$row['row1']},{$row['row2']}");
        $dbconnect->query("DELETE FROM `ARTICLES` where `id`={$_POST['id']}");
    }
}

答案 1 :(得分:2)

你的直觉是正确的。有时你想要“取消删除”帖子,或者参考已删除帖子的内容。想象一下,如果有人对别人的生命施加了威胁;你想要从视图中删除它,但也希望保留记录,比如,如果事情升级,请与警方分享。

一种常见的方法是将DATETIME列添加到您的表中,例如, deleted_at。在您“删除”帖子之前,此列将为NULL,此时它只会获得UPDATE d当前日期和时间。然后,很容易只显示未删除的记录,例如SELECT ... WHERE deleted_at IS NULL

如果性能成为问题(可能不会)或磁盘大小确实存在,那么您偶尔可以删除已删除的帖子,例如:

DELETE FROM posts
WHERE
  # DELETE all rows that were "deleted" more than a year ago
  COALESCE( deleted_at, NOW() ) < NOW() - INTERVAL 1 YEAR
;