如何从单个MYSQL查询中获取要删除的图像列表

时间:2018-02-15 12:49:41

标签: php mysql sql

我在数据库中有一个表,可以跟踪每个主系统的所有图像,如下所示:

Table: system_images
field: systemid
field: imglarge
field: imgthumb

有时会从数据库中删除系统,包括属于该系统条目的system_images中的所有记录。但是,图像本身仍然在服务器上。目前有一个cron作业抓取目录中的所有图像,然后每次查询以查看该图像是否仍在表中,如果没有则从服务器上删除该图像。这是当前的cron工作的样子

$system_images = array_diff(scandir($global_productimages),array('..', '.'));
$image_count = count($system_images);

if($image_count > 0)
{

    foreach($system_images AS $curr_image)
    {

        $image_name = trim($curr_image);

        $find = $image_query->findSystemImage($image_name);

        if($find == 0)
        {

            unlink($imgpath .$image_name);

        }

    }

}

有没有办法我不必为每个图像做一个查询?目录中可能有数千个图像。

2 个答案:

答案 0 :(得分:2)

为什么删除系统后不立即删除它们?

1)在删除系统记录之前,请使用SELECT语句并推入array其所属的图像名称

2)Delete记录

3)Unlink图片通过迭代持有图像的array

如果您逐个扫描并查询数据库,则无需使用cron进行此作业,看起来太重了。

答案 1 :(得分:0)

两个建议

短期(扩大@ paokg4的建议)

您可以使用类似

之类的东西轻松地在命令行上执行清理
FILEPATH=/global/product/imagedir; mysql -ENe 'select imglarge, imgthumb from `yourdbname`.`system_images` where systemid = 123' | grep -v '^\*' | xargs -i rm $FILEPATH/{}

我们使用mysql的垂直输出格式(-E)在删除列名(-N)的同时同时获取两个文件名,使用grep抑制输出中的行号,并将结果传递给rm

长期

听起来好像你在这里遇到的主要问题是删除系统'可能有成千上万的相关图像 - 最后的整理练习。对于这个问题,它建议您将多个系统的图像存储在一个目录中,并且在文件系统级别没有明显的方法来区分与不同系统关联的图像。

如果这确实是当前设置的特征,那么它还建议了一些问题的长期解决方案,这些解决方案允许通过单个操作删除文件,例如。

  1. 将不同系统的图像存储在不同的目录中 - 在哪种情况下你可以删除目录。

  2. 为您存储的文件名添加系统前缀,然后允许 您可以使用简单的通配符搜索删除它们。