PHP实现MySQL数据库PDF记录与文件同时删除的问题求助
解决PHP同时删除数据库记录与文件的问题
你的删除功能失效主要有几个关键问题,以下是修正方案:
原代码的问题点
- SQL语句未正确拼接且未执行:
sprintf缺少占位符,导致生成的SQL语法错误,而且没有执行数据库删除的操作代码。 - 存在SQL注入风险:直接拼接
$_GET参数到SQL语句中,容易被恶意攻击。 - 文件删除前未做存在性检查:直接调用
unlink可能因文件不存在、权限不足等报错,导致流程中断。
修正后的Hapus.php代码
include "Koneksi.php"; // 先检查参数是否存在 if (!isset($_GET['url']) || empty($_GET['url'])) { header("location:Index.php?error=参数缺失"); exit; } $folderPath = $_GET['url']; // 1. 先执行数据库删除(使用预处理语句防注入) $stmt = $conn->prepare("DELETE FROM simpanfile WHERE Folder_Berkas = ?"); $stmt->bind_param("s", $folderPath); // "s"表示字符串类型参数 if ($stmt->execute()) { // 数据库删除成功后,再删除文件 if (file_exists($folderPath)) { if (unlink($folderPath)) { header("location:Index.php?success=删除成功"); } else { // 文件删除失败,但数据库已删,可根据需求调整提示 header("location:Index.php?warning=数据库记录已删除,但文件删除失败"); } } else { header("location:Index.php?warning=数据库记录已删除,但文件不存在"); } } else { // 数据库删除失败 header("location:Index.php?error=数据库删除失败"); } $stmt->close(); $conn->close();
额外优化建议
- 优先使用主键
Kode作为删除标识:当前用Folder_Berkas可能存在多个文件同路径的情况,传递Kode更准确。比如Index.php里的删除链接改成:
对应的Hapus.php需先查询文件路径再删除:<a href="Hapus.php?kode=<?php echo $row['Kode']; ?>">Hapus</a>$kode = $_GET['kode']; // 先查询文件路径 $stmtSelect = $conn->prepare("SELECT Folder_Berkas FROM simpanfile WHERE Kode = ?"); $stmtSelect->bind_param("i", $kode); // "i"对应整数类型主键 $stmtSelect->execute(); $result = $stmtSelect->get_result(); $row = $result->fetch_assoc(); $folderPath = $row['Folder_Berkas']; // 再执行删除数据库记录 $stmtDelete = $conn->prepare("DELETE FROM simpanfile WHERE Kode = ?"); $stmtDelete->bind_param("i", $kode); // 后续文件删除逻辑同之前代码 - 增加权限检查:确保PHP进程对文件所在目录有写入/删除权限,否则
unlink会执行失败。 - 记录错误日志:用
error_log()函数记录删除过程中的异常,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Muhammad Haries
相关产品推荐
相关产品推荐

