检查文件系统文件与db的一致性

时间:2013-09-01 17:52:30

标签: php mysql readdir scandir

我有一个PHP脚本,可以将文件上传到我的文件系统上的目录。同时我将文件名存储在MYSQL数据库的字段中。

我看到我的文件比db中的记录多。

查找和删除未链接到数据库记录的所有文件的最短方法是什么?我的想法是从目录中读取每个文件名,在db上运行查询,文件名取自步骤1,如果查询返回0结果,则删除文件。

提前感谢任何建议。

Lelio

1 个答案:

答案 0 :(得分:1)

使用scandir获取文件夹中的所有文件,并使用NOT IN子句删除不在文件夹中的文件。

$files = implode(scandir('files/'), "', '");
$db->query("DELETE FROM files WHERE file_name NOT IN('{$files}')");

如果要执行相反操作并删除未链接到数据库中记录的文件,可以使用名为unlink的函数。这将删除该文件。可能有更多优化版本,但这就是我要做的:

$files = implode(scandir('files/'), "', '");
$sth = $db->query("SELECT * FROM files WHERE file_name NOT IN('{$files')");

foreach($sth->fetchAll(PDO::FETCH_OBJ) as $file) {
    unlink("files/{$file_name}");
}