0

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

我有三个表,其中包含照片信息,并且贯穿始终。下面是一个关于我认为它应该是什么样子的模型查询。

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

left_imageright_imageabout_photosphoto1, photo2,photo3photo4一起去facilitieshome_photohome.

另外,我需要在照片的末尾使用通配符,因为文件有缩略图,所以例如原始照片会被调用,abcimage.jpg但是在我只存储的数据库中也会有abcimage.jpg, abcimage_medium.jpg,并添加其余的文件名取决于它的去向。abcimage_thumb.jpgphotos/abcimage

4

3 回答 3

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);
}
于 2012-08-23T12:20:26.980 回答
0

你有两个选择:

一:

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

二:

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

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

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

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

于 2012-08-23T12:25:01.160 回答
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;
     }
}

?>

于 2014-06-17T13:13:12.253 回答