Проблема, которую я пытаюсь решить в лучшем случае, - это удалить папку с изображениями с тегами. Таким образом, для каждого изображения нужно удалитьэлегантное решение для нескольких инструкций подготовки
-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();
Я также была идея создания нескольких соединений, но я думаю, что может получить проблематично, если, например, удалите изображение, пока у меня все еще есть запрос, повторяющий изображения.
Если вы используете таблицы 'innodb', вы можете настроить каскадные внешние ключи, что потенциально упростит весь процесс. – RamRaider
Похоже, вам стоит подумать о том, чтобы перепроектировать вашу базу данных и/или хотя бы сделать транзакцию для запуска этих нескольких удалений внутри – RiggsFolly