私がより良い方法で解決しようとしている問題は、タグを持つ画像を含むフォルダを削除することです。したがって、各画像のために、私は、フォルダのすべての画像IDを取得現時点で複数の準備文のための洗練されたソリューション
に-the画像自体3つのデータベース(img_offer、img_member、img_horses)
からその画像の
- タグを削除する必要があります4つの異なるクエリでこれらの4回にわたって反復処理を行うと、かなり非効率的に見えます。
主な問題は、私が知っている限り、複数の準備文を同時に開くことはできず、各反復で新しい文を作成することも直感的ではないようです。
は、私は最善のアプローチは、複数のクエリのようなものが文を準備だろうことだと思うが、私は似た何かを見つけることができませんでしたどのようなので、多分ここで誰かがクリーンな方法でこれを解決する方法のアイデアを持っている
私の考え
$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