Php 不删除第二个表中的行

Php 不删除第二个表中的行,php,mysql,mysqli,Php,Mysql,Mysqli,我想根据图像的文件名从数据库中删除一行。假设我有以下两张表: 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

我想根据图像的文件名从数据库中删除一行。假设我有以下两张表:

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
假设在我的应用程序中,我删除了文件image dog_2.png,然后我希望它删除图像表中状态为dog_2.png的行(这工作正常),并能够从图像问题表中删除该行,其中该行包含与图像表中的图像ID和图像文件名关联的相同图像ID(这不起作用)

因此,对于上面的示例,删除后的两个表现在应如下所示:

Image Table:

ImageId  ImageFile

01       cat.png
02       dog.png

Image_Question Table:

ImageId   SessionId   QuestionId
01        AAA              4
02        ABD              1
但它不会从Image_问题表中删除该行,如何才能删除该行

以下是从图像表中删除行的完整代码,其中包含已设置但在从图像表中删除行时未完全完成的大部分代码:

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

您可以使用
JOIN
查询在一个查询中从多个表中删除。我认为这种语句适合您:

$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 = ?";

您可以使用
JOIN
查询在一个查询中从多个表中删除。我认为这种语句适合您:

$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 = ?";

您使用的是哪个存储引擎?如果您使用的是
InnoDB
,则可以在DELETE CASCADE上添加带有
的外键(请参阅),这将消除您在应用程序代码中处理此问题的需要。我不知道它是哪个存储引擎,但您能在回答中告诉我如果需要使用DELETE CASCADE,代码应该是什么样子吗?如果您有InnoDB,并在DELETE CONSTRAINT
上添加一个带有
的外键,那么您可以删除所有删除的PHP代码
Image\u Question
中的记录,因为一旦您从
Image
中删除了一条记录,它的所有子记录也会立即被删除。因此,SQL(phpmyadmin)中的代码应该是:
ALTER TABLE Image\u Question ADD FOREIGN KEY('ImageId')引用Image('ImageId')关于DELETE CASCADE
?是的,完全正确,除了我不确定
ImageId
周围的单引号。反勾号会更好,先生。您使用的是哪个存储引擎?如果您使用的是
InnoDB
,您可以在DELETE CASCADE
上添加带有
的外键(请参阅),这将消除您在应用程序代码中处理此问题的需要。我不知道它是哪个存储引擎,但您能在回答中告诉我如果需要使用DELETE CASCADE,代码应该是什么样子吗?如果您有InnoDB,并在DELETE CONSTRAINT
上添加一个带有
的外键,那么您可以删除所有删除的PHP代码
Image\u Question
中的记录,因为一旦您从
Image
中删除了一条记录,它的所有子记录也会立即被删除。因此,SQL(phpmyadmin)中的代码应该是:
ALTER TABLE Image\u Question ADD FOREIGN KEY('ImageId')引用Image('ImageId')关于DELETE CASCADE
?是的,完全正确,除了我不确定
ImageId
周围的单引号。倒勾会更好,IMHO。我想在mysqli中使用bind_参数,因为它更安全,这是否意味着代码是这样的:
删除图像,图像问题来自图像内部连接图像问题图像。图像ID=?和我mage.ImageFile=?;
$delete->bind_参数(“ss”,Image_Question.ImageId,$img)
我想在mysqli中使用bind_参数是因为它更安全,这是否意味着代码是这样的:
删除图像,图像的问题从图像内部连接图像的问题在哪里Image.ImageId=?和Image.ImageFile=?;
$DELETE->bind_参数(“ss”,Image_Question.ImageId,$img);