多个准备语句的优雅解决方案

时间:2016-09-06 08:54:22

标签: php mysql sql prepare

我想以更好的方式解决的问题是删除包含带标签的图像的文件夹。因此,我需要删除每个图像

- 图像本身

来自三个数据库的图像的标签(img_offer,img_member,img_horses)

目前我获取要删除的文件夹的所有图像ID,然后使用四个不同的查询迭代这四次,这看起来非常低效。

主要问题是,据我所知,您不能同时打开多个准备语句,并且在每次迭代中创建新语句似乎也是违反直觉的。

我认为最好的方法是多次查询准备语句,但我找不到类似的东西,所以也许有人知道如何以更清洁的方式解决这个问题

我的想法就像是

<webContainer deferServletLoad="false"/>

但是我认为这不会起作用,因为预准备语句中不支持多个SQL查询,或者它们是不是?

这是我目前的代码:

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

我也有创建多个连接的想法,但我认为如果可能的话,可能会出现问题。删除图像时,我仍然有一个迭代图像的查询。

1 个答案:

答案 0 :(得分: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实际文件。