2012-08-23 19 views
0

我试图从名为“照片”的文件夹中删除当前不在我的数据库中的照片。 (这些是已经叠起来,因为我已经建立了网站,并测试它和所有的这样的照片,所以现在是时候采取现场直播,我不希望在所有这些废物)删除不在我的数据库中的文件

我有三张带有照片信息的桌子,以及一些列。下面是关于我认为它应该是什么样子的模型查询。

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

left_imageright_imageabout_photosphoto1,photo2,photo3photo4facilities一致。 home_photo结合home

另外,我需要使用通配符照片的结束,因为这些文件有缩略图,所以例如原始照片将会被调用,abcimage.jpg但仍然会有abcimage.jpgabcimage_medium.jpgabcimage_thumb.jpg也是在数据库中,我只存储,photos/abcimage并添加文件名的其余部分取决于它去哪里。

+0

好了,你有什么样的代码,到目前为止并在那里被它失败? – BugFinder

+0

我一直无法弄清楚如何开始,与MySQL查询。我在上面发布了我曾尝试过的内容,但我不知道如何使其正常工作。 –

+1

你最大的问题是它在你的表中没有正常化,我会建议做一个查询并把所有图像的名字,并用PHP制作一段时间,并开始移动循环中创建的文件到一个新的文件夹,之后,你可以删除所有来自“旧文件夹”的图片 – jcho360

回答

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); 
} 
+0

请忘记'mysql_ *'函数。使用PDO来代替 – Touki

+1

Do $ images = glob($ directory。“*。[jJ] [pP] [gG]”);抓住'.JPG'扩展的图像 –

+0

我更喜欢基于opendir + readdir的东西,以处理潜在的大量文件。 – slim

0

你有两个选择:

一:

  • 随着SQL查询,获得全部通过的文件在数据库中引用
  • 迭代照片的完整列表在您的目录中
    • 如果文件是图像并且它不在您的列表中,de lete文件。

二:

  • 迭代通过目录
    • 的文件,如果该文件是一个图像
      • 查询数据库中该文件名
        • 如果回应是空的,删除文件

确切的SQL查询取决于你的表结构,你没有提供。

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

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

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

?>

相关问题