簡體   English   中英

多種准備語句的完美解決方案

[英]elegant solution for multiple prepare statements

我試圖以更好的方式解決的問題是刪除包含帶有標簽的圖像的文件夾。 因此,對於每個圖像,我需要刪除

-圖像本身

來自三個數據庫(img_offer,img_member,img_horses)的圖像的標簽

目前,我要刪除該文件夾的所有圖像ID,然后使用四個不同的查詢遍歷這四次,這似乎效率很低。

主要問題是,據我所知,您不能同時打開多個prepare語句,並且在每次迭代中創建新的語句似乎也違反直覺。

我認為最好的方法是類似多重查詢的prepare語句,但是我找不到類似的東西,所以也許有人在這里有了一個如何以更清潔的方式解決此問題的想法

我的想法是

$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();

我也有創建多個連接的想法,但是我認為如果刪除一個圖像而我仍然有一個遍歷圖像的查詢,可能會出現問題。

您根本不必遍歷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實際文件的unlink

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM