如何根据数据表记录ID批量删除关联的多张图片?
解决删除文章时无法删除对应所有图片的问题
你的问题出在只获取了匹配文章ID的第一张图片记录,所以只删除了单张图片。要删除所有关联图片,需要遍历images表中所有匹配id2='$id'的记录,逐个删除对应的文件。
另外,你的代码存在SQL注入风险,直接把$_GET['id']拼进SQL语句里非常不安全,建议改用预处理语句来避免这个问题。
修改后的代码如下:
<?php include('assets/system/core.php'); // 先验证ID的合法性,避免非法输入 if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { header("LOCATION: " . $web_settings['weblink'] . "mispropiedades.php"); exit; } $id = (int)$_GET['id']; // 用预处理语句查询所有关联图片 $stmt = mysqli_prepare($db, "SELECT file_name FROM images WHERE id2 = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 循环遍历所有图片记录,逐个删除文件 while ($registro = mysqli_fetch_assoc($result)) { $ruta = $registro['file_name']; $filePath = "uploads/" . $ruta; // 先检查文件是否存在,避免unlink报错 if (file_exists($filePath)) { unlink($filePath); } } // 执行数据库删除操作(同样改用预处理语句更安全) $stmt = mysqli_prepare($db, "DELETE FROM amenidades WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $stmt = mysqli_prepare($db, "DELETE FROM images WHERE id2 = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $stmt = mysqli_prepare($db, "DELETE FROM propiedades WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $stmt = mysqli_prepare($db, "DELETE FROM visit_days WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $stmt = mysqli_prepare($db, "DELETE FROM comments WHERE prpdad_id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); header("LOCATION: " . $web_settings['weblink'] . "mispropiedades.php"); exit; ?>
关键修改点:
- 增加了ID合法性校验,避免非法输入
- 使用预处理语句替代直接拼接SQL,彻底解决SQL注入风险
- 用
while循环遍历所有关联图片记录,逐个删除对应的文件 - 删除文件前先检查文件是否存在,避免因文件缺失导致的报错
内容的提问来源于stack exchange,提问作者Aland Ramirez Araiza
相关产品推荐
相关产品推荐

