根据数据库检查文件系统文件的一致性


check filesystem file consistency against db

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

我发现数据库中的文件比记录多。

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

提前谢谢你的建议。

Lelio

使用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}");
}