php - 检查文件系统文件与数据库的一致性

标签 php mysql readdir scandir

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

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

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

预先感谢您的任何建议。

雷里奥

最佳答案

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

关于php - 检查文件系统文件与数据库的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18561213/

相关文章:

c - readdir() 问题

javascript - 如何加载特定的 div 或 id ajax 和 laravel

php - 无法在mysql中添加子查询别名

php - opencart 支付网关

php - CakePHP 3.0 登录每次都返回 false

php - PHP 中的 scandir() 太慢了

php - 如何每 36 小时运行一次 crontab

mysql - 使用 VB.Net 将 Excel 电子表格导入 MySQL DB

MySql "comments"参数作为描述符?

C - Linux 稀疏文件 : How to check if file is sparse and print 0-filled disk blocks