2016-09-06 3 views
0

Проблема, которую я пытаюсь решить в лучшем случае, - это удалить папку с изображениями с тегами. Таким образом, для каждого изображения нужно удалитьэлегантное решение для нескольких инструкций подготовки

-The самого

-tags этого изображения из трех баз данных (img_offer, img_member, img_horses)

На данный момент я получаю все изображения идентификаторов папки изображения который будет удален, а затем повторить эти четыре раза с четырьмя различными запросами, что кажется довольно неэффективным.

Основная проблема заключается в том, что, насколько я знаю, вы не можете одновременно открывать несколько инструкций подготовки и создавать инструкции, новые на каждой итерации, также противоречат интуиции.

То, что я думаю, что было бы лучшим подходом было бы что-то вроде множественного запроса подготовить заявление, но я не мог найти ничего подобного так, может быть, кто-то здесь есть идея, как решить эту проблему в более чистого пути

Моя идея было бы что-то вроде

$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). Вы можете удалить из базы данных все связанное с определенной folder_id на одном дыхании:

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 = ?; 

Из причины, до того, что вы должны unlink сами файлы.

+0

да, я просто оставил развязать причину в примере кода, потому что это не имеет отношения к проблеме Большое спасибо! Я попробую это, вот что я искал :) – Juliette

+0

@Juliette Совсем нет. В зависимости от компоновки данных вы также можете дважды проверить, что одно изображение не может быть связано (с помощью 'image_id') с несколькими папками. –

 Смежные вопросы

  • Нет связанных вопросов^_^