繁体   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