【问题标题】:Find out what files are in a directory that are "not" listed in the database找出在数据库中“未”列出的目录中的哪些文件
【发布时间】:2011-04-08 23:36:26
【问题描述】:

我有一个小型画廊网站,但目录中的图像数量与数据库中的图像数量相差 150 左右,所以我想知道是否有办法找出/列出目录中的哪些文件“不是" 在数据库中(反之亦然)。

基本数据库结构:

  • 图片
    • 身份证
    • 图片

图像名称以“imagename.jpg”的形式存储在数据库中

图像本身存储在图像目录中

图片/

【问题讨论】:

  • 数据库表是什么样子的?文件是如何存储的?信息太少,无法回答这个问题。

标签: php sql database list


【解决方案1】:

将服务器中的文件名放在一个数组中,将数据库中的文件放在另一个数组中。使用array_diff() 获取结果。

示例(PHP):

$files_db = array("car.jpg", "bike.jpg", "plane.jpg", "ship.jpg", "tank.jpg"); 
$files_server = array("car.jpg", "bike.jpg", "ship.jpg", "rocket.jpg"); 

使用

print_r(array_diff($files_db, $files_server));

输出

Array
(
    [2] => plane.jpg
    [4] => tank.jpg
)

或者(反之亦然)

print_r(array_diff($files_server, $files_db));

输出

Array
(
    [3] => rocket.jpg
)

【讨论】:

  • 注意:您可以使用$files_server = scandir('/path/to/images/');在服务器上制作文件数组。
【解决方案2】:

如果这可能是一次性问题,我会用一个半途而废的解决方案来解决这个问题,首先使用一个小 SQL 脚本:

SELECT filename FROM images;

并要求数据库客户端mysqlpsql 或其他任何将输出作为纯文本转储到文件中。 (如果您无法轻松找到数据库客户端的“转储到文件”命令,Shell 重定向可能会完成这项工作。)

然后我会得到目录列表:

ls /path/to/images/ > ls_files

同时排序:

sort db_files > db_files.sorted
sort ls_files > ls_files.sorted

然后运行diff(1)查看哪些文件在哪里被引用:

diff -u ls_files.sorted db_files.sorted

+- 为前缀的行在一个而不是另一个。

您可能需要编辑 SQL 输出或 ls 输出以使其中一个与另一个匹配。如果您的编辑器有类似vim^V 块选择之类的工具,则可以简化其中一些编辑任务,但有时仅从另一个目录运行ls 可以帮助在每个文件名前面添加正确的目录结构。

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2020-01-21
    • 2012-12-09
    • 2023-03-03
    • 2012-01-23
    • 2012-10-10
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多