删除不在我的数据库中的文件

时间:2012-08-23 12:11:20

标签: php mysql

我正在尝试删除目前不在我的数据库中的文件夹(称为“照片”)中的照片。 (这些都是随着我一直在建立网站并对其进行测试而叠加的照片等等,所以现在是时候把网站带到现场了,我不希望所有这些都浪费在其中)

我有三张桌子,里面有照片信息,还有很多列。下面是关于我认为它应该是什么样子的模型查询。

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

left_imageright_imageabout_photos一起使用。 photo1photo2photo3photo4facilities一起使用。 home_photohome一起使用。

另外,我需要在照片的末尾使用通配符,因为文件有缩略图,所以例如原始照片会被调用abcimage.jpg,但会有abcimage.jpg,{ {1}},abcimage_medium.jpg也在我只存储的数据库abcimage_thumb.jpg中,并根据文件的位置添加文件名的其余部分。

3 个答案:

答案 0 :(得分:2)

$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);
}

答案 1 :(得分:0)

您有两种选择:

一:

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

<强>两个

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

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

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

有更复杂的选项涉及缓存和先发制人的查询,但我想你不想那么深入。

答案 2 :(得分:0)

如下所示。我在文件夹中也有原始文件,我一次限制为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;
     }
}

&GT;