2016-09-06 22 views
0

私がより良い方法で解決しようとしている問題は、タグを持つ画像を含むフォルダを削除することです。したがって、各画像のために、私は、フォルダのすべての画像IDを取得現時点で複数の準備文のための洗練されたソリューション

に-the画像自体3つのデータベース(img_offer、img_member、img_horses)

からその画像の

- タグを削除する必要があります4つの異なるクエリでこれらの4回にわたって反復処理を行うと、かなり非効率的に見えます。

主な問題は、私が知っている限り、複数の準備文を同時に開くことはできず、各反復で新しい文を作成することも直感的ではないようです。

は、私は最善のアプローチは、複数のクエリのようなものが文を準備だろうことだと思うが、私は似た何かを見つけることができませんでしたどのようなので、多分ここで誰かがクリーンな方法でこれを解決する方法のアイデアを持っている

私の考え

$multiplePreparedStatement= "DELETE this FROM that WHERE id=?; 
          DELETE this2 FROM that2 WHERE id2=?; 
          DELETE this3 FROM that3 WHERE id3=?;"; 
$preparedStmt = $conn->prepare($multiplePreparedStatement); 
foreach($imgArray as $imgId){ 
    $preparedStmt->bind_param("iii", $imgId, $imgId, $imgId); 
    $preparedStmt->execute(); 
} 
$preparedStmt->close(); 

しかし、私はそれが複数のSQLとして機能するとは思わない質問は準備された文でサポートされていないか、それともそれらですか?ここで

は私の現在のコードです:

 $id=$_GET['deleteAlbum']; 
     $getImages = "SELECT image_id AS id 
         FROM Images 
         WHERE folder_id = ?"; 
     $deleteImage="DELETE FROM Images 
         WHERE image_id=?"; 
     $deleteOffer = "DELETE FROM Images_Offers 
         WHERE image_id=?"; 
     $deleteHorse = "DELETE FROM Images_Horses 
         WHERE image_id=?"; 
     $deleteTeam = "DELETE FROM Images_Team 
         WHERE image_id=?"; 

     //get all image ids 
     $ImgStmt=$conn->prepare($getImages); 
     $ImgStmt->bind_param("i", $id); 
     $ImgStmt->execute(); 
     $ImgStmt->bind_result($id); 
     $imgToDelete = array(); 
     while($ImgStmt->fetch()){ 
      array_push($imgToDelete, $id); 
     } 
     $ImgStmt->close(); 

     $stmt=$conn->prepare($deleteOffer); 
     foreach ($imgToDelete as $imgId){ 
      $stmt->bind_param("i",$imgId); 
      $stmt->execute(); 
     } 
     $stmt->close(); 

     $stmt=$conn->prepare($deleteHorse); 
     foreach ($imgToDelete as $imgId){ 
      $stmt->bind_param("i",$imgId); 
      $stmt->execute(); 
     } 
     $stmt->close(); 

     $stmt=$conn->prepare($deleteTeam); 
     foreach ($imgToDelete as $imgId){ 
      $stmt->bind_param("i",$imgId); 
      $stmt->execute(); 
     } 
     $stmt->close(); 

     $stmt=$conn->prepare($deleteImage); 
     foreach($imgToDelete as $imgId){ 
      unlink("../assets/img/images/img".$imgId.".jpg"); 
      $stmt->bind_param("i",$imgId); 
      $stmt->execute(); 
     } 
     $stmt->close(); 

私はまた、複数の接続を作成するためのアイデアを持っていたが、私は、例えば場合には、問題を得るかもしれないと思います私はまだ画像を繰り返してクエリを持っている間に画像を削除します。

+0

'innodb'テーブルを使用している場合は、カスケードする外部キーを設定して、プロセス全体を単純化する可能性があります。 – RamRaider

+0

あなたのデータベースを再設計し、少なくともこれらの複数の削除を実行するトランザクションを作成する必要があります – RiggsFolly

答えて

0

image_id(少なくともSQLデータ用ではありません)を繰り返す必要はありません。あなたが実際のファイルをunlinkする必要があり、その前に、原因を

DELETE Images, Images_Offers, Images_Horses, Images_Team 
FROM Images 
LEFT JOIN Images_Offers ON Images_Offers.image_id = Images.image_id 
LEFT JOIN Images_Horses ON Images_Horses.image_id = Images.image_id 
LEFT JOIN Images_Team ON Images_Team.image_id = Images.image_id 
WHERE folder_id = ?; 

:あなたは一度の特定folder_idに関連付けられているデータベースのすべてのものから削除することができます。

+0

ええ、私は例のコードの原因を解除したままにしていますので、問題に無関係です。 ありがとう!私はこれを試してみよう、それは私が探していたものです:) – Juliette

+0

@Julietteまったくありません。データのレイアウトによっては、ある画像を複数のフォルダに( 'image_id 'で)リンクすることはできません。 –

関連する問題