0

現在データベースにない「写真」というフォルダから写真を削除しようとしています。(これらはすべて、私がウェブサイトを構築してテストしている間に積み上げられた写真です。そのため、サイトを公開する時が来ました。このような無駄をすべて入れたくありません)

写真情報を含む 3 つのテーブルと、全体に多数の列があります。以下は、どのように見えるべきかについてのモックアップ クエリです。

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

left_imageright_image一緒に行きabout_photosます。 photo1photo2photo3そして とphoto4一緒に行きfacilitiesます。 home_photoと一緒homeです。

また、ファイルにはサムネイルがあるため、写真の最後にワイルドカードを使用する必要があります。たとえば、元の写真が呼び出されますが、私が保存するだけのデータベースにも ,がありabcimage.jpg、残りのどこに行くかによってファイル名が異なります。abcimage.jpgabcimage_medium.jpgabcimage_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

次の 2 つのオプションがあります。

1:

  • SQL クエリを使用して、データベースで参照されているすべての写真の完全なリストを取得します
  • ディレクトリ内のファイルを反復処理します
    • ファイルが画像であり、リストにない場合は、ファイルを削除します。

二:

  • ディレクトリ内のファイルを反復処理します
    • ファイルが画像の場合
      • そのファイル名をデータベースに問い合わせる
        • 応答が空の場合、ファイルを削除します

正確な SQL クエリは、提供していないテーブル構造によって異なります。

最適なオプションは、主に規模によって異なります。データベースに多数の画像がある場合、最初のオプションでは、メモリ内に非常に大きなリストを作成します。ただし、2 番目のバージョンには、さらに多くのデータベース クエリが含まれます。したがって、それはトレードオフです。

キャッシングやプリエンプティブ クエリを含む、より洗練されたオプションがありますが、まだそこまで深く掘り下げたくないのではないでしょうか。

于 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 に答える