删除不在数据库中的文件


Delete files that are not in my database

我正在尝试从一个名为"照片"的文件夹中删除当前不在我的数据库中的照片。(这些都是我在构建网站并对其进行测试等时堆叠起来的照片,所以现在是时候让网站上线了,我不希望所有这些浪费都在里面(

我有三个表格,里面有照片信息,还有几列贯穿始终。下面是一个关于我认为它应该是什么样子的模型查询。

SELECT left_image, right_image, photo1, photo2, photo3, photo4, home_photo 
FROM about_photos, facilities, home

left_imageright_image一起去about_photos. photo1photo2photo3photo4facilities同行。 home_photohome同在.

另外,我需要在照片的末尾使用通配符,因为文件有缩略图,所以例如原始照片将被调用,abcimage.jpg但会有abcimage.jpgabcimage_medium.jpgabcimage_thumb.jpg也在数据库中我只存储、photos/abcimage并根据文件名的去向添加

其余部分。
$directory = "../path/to/photos_directory/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.jpg");
foreach($images as $image)
{
    $name = explode('_',$image);
    $name = 'photos/' . $name[0];
    $sql = mysql_query("SELECT id FROM table WHERE photo1='$name' OR photo2='$name'");
    if(mysql_num_rows($sql) == 0)
        unlink($directory . $image);
}

您有两个选择:

一:

  • 使用 SQL 查询,获取数据库中引用的所有照片的完整列表
  • 循环访问目录中的文件
    • 如果文件是图像并且不在您的列表中,请删除该文件。

二:

  • 循环访问目录中的文件
    • 如果文件是图像
      • 在数据库中查询该文件名
        • 如果响应为空,请删除该文件

确切的 SQL 查询取决于您尚未提供的表结构。

最佳选择主要取决于规模。如果数据库中有很多图像,则第一个选项涉及在内存中有一个非常大的列表。但是,第二个版本涉及更多的数据库查询。所以这是一个权衡。

有更复杂的选项涉及缓存和抢占式查询,但我想你还不想深入。

如下所示。我的文件夹中也有原始文件,我一次限制为 500 次删除。根据需要进行调整。希望它能节省一些时间...

<?php
require 'session.php';
require 'settings.php';
/* Execute the query. */  
$DBH = new PDO($mssql_driver.'='.$mssql_server.';'.$mssql_dbkey.'='.$mssql_database,        $mssql_username, $mssql_password); 
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
$tsql = 'select * from ProductImage';
$PRE = $DBH->prepare($tsql);
$PRE->execute();
$pictures =$PRE->fetchAll(PDO::FETCH_ASSOC);
$directory = $_SERVER["DOCUMENT_ROOT"]."'..'..'products'pictures/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.jpg");
$counter =0;
foreach($images as $image)
{
   $name = explode('pictures/',$image);
   $name =  $name[1];
    $foundImage = false;
    print  "checking: ".$name;
    foreach ($pictures as $picture){
         $original_file = explode('.', $picture['Image_Big']);
         $original_file = $original_file[0].'-original.'.$original_file[1];

         if ( ($picture['Image_Small'] == $name)|| ($picture['Image_Big'] == $name) || ( $original_file == $name) || ($picture['Image_Thumb'] == $name) || ($picture['Image_PriceList'] == $name)){
               $foundImage = true;  
               break;       
         }
    }
    if (!$foundImage) {
         unlink($directory . $name);
         print "....deleting";
         $counter += 1;
     }
     print "<br />";

     if ($counter> 500){ 
         exit;
     }
}

?>