1

画像のファイル名に応じて、データベースから行を削除したい。以下に2つのテーブルがあるとしましょう。

Image Table:

ImageId  ImageFile

01       cat.png
02       dog.png
03       dog_2.png

Image_Question Table:

ImageId   SessionId   QuestionId
01        AAA              4
02        ABD              1
03        RTD              11

私のアプリケーションでファイルimagedog_2.pngを削除してから、画像テーブルのdog_2.pngを示す行を削除して(これは正常に機能しています)、Image_Questionテーブルから行を削除できるようにしたいとします。行には、画像テーブルのImageIdおよびImageFile名に関連付けられた同じImageIdが含まれています(これは機能していません)。

したがって、上記の例では、削除後の2つのテーブルは次のようになります。

Image Table:

ImageId  ImageFile

01       cat.png
02       dog.png

Image_Question Table:

ImageId   SessionId   QuestionId
01        AAA              4
02        ABD              1

ただし、Image_Questionテーブルから行が削除されるわけではありません。この行を削除するにはどうすればよいですか?

以下は、画像テーブルから行を削除する完全なコードであり、セットアップされているが、Image_Questionテーブルから行を削除しても完全には完了していないコードのほとんどが含まれています。

$image_file_name = $_GET["imagefilename"];
$img = "ImageFiles/$image_file_name";

echo "$image_file_name was Deleted";
unlink("ImageFiles/$image_file_name");

$imagedeletesql = "DELETE FROM Image WHERE ImageFile = ?";

if (!$delete = $mysqli->prepare($imagedeletesql)) {
    // Handle errors with prepare operation here
}

//Don't pass data directly to bind_param; store it in a variable
$delete->bind_param("s",$img);

$delete->execute();

if ($delete->errno) {
    // Handle query error here
}

$delete->close();

$imagequestiondeletesql = "DELETE FROM Image_Question WHERE ImageId = ?";

if (!$deleteimagequestion = $mysqli->prepare($imagequestiondeletesql)) {
    // Handle errors with prepare operation here
}

// Don't pass data directly to bind_param; store it in a variable
$deleteimagequestion->bind_param("s",....);

$deleteimagequestion->execute();

if ($deleteimagequestion->errno) {
    // Handle query error here
}

$deleteimagequestion->close();  
4

1 に答える 1

1

クエリを使用JOINして、1つのクエリで複数のテーブルから削除できます。私はこの種のステートメントがあなたのために働くと思います:

$sql = "
DELETE img, img_q
FROM Image AS img
LEFT JOIN Image_Question AS img_q
    ON img_q.ImageId = img.ImageId
WHERE img.ImageFile = ?";
于 2012-09-21T00:56:14.857 に答える