PHP+MySQL删除操作中无法展示未删除记录的用户信息及错误码
PHP 和 MySQL 文件与数据库删除异常问题
已实现功能
- 表单数据获取正常
- 数据库记录和服务器文件的删除功能正常
存在问题
服务器文件删除失败时,无法展示对应记录的female_name、male_name及自定义错误码,仅显示空值。后续还需处理数据库删除失败的情况,展示对应信息和格式为wed_<id>_DB的错误码。
背景信息
- MySQL表
weddings字段:id(int、主键、自增)、male_name、female_name、year、file(存储PDF文件名) - 表单每条记录对应复选框,id为记录id,value为文件名(格式
wed_<wed_id>.pdf) - 需同时删除数据库记录和服务器PDF文件
- 数组说明:
undeleted_weds_serv:存储服务器文件删除失败的记录ID,成功则存0,数组及长度已验证正常length_undeleted_serv:undeleted_weds_serv的长度
现有代码
// 遍历$_GET数组(数据获取正常) foreach ($_GET as $id_casat => $fisier) { //1. 删除服务器上的文件 $directory_path = '../../Continut_site/Primaria/Birouri/Evidenta_persoane/publicatii_casatorie/2024_teste'; $file_path = $directory_path . '/' . $fisier; if (unlink($file_path)) { $casatorii_Sterse_serv[] = $wed_id; $undeleted_weds_serv[] = 0; } else { $undeleted_weds_serv[] = $wed_id; } //2. 删除数据库中的记录 $sql = "DELETE FROM weddings WHERE id = $wed_id"; if (mysqli_query($con, $sql)) { $db_deleted_weds[] = $wed_id; $db_undeleted_weds[] = 0; } else { $db_undeleted_weds[] = $wed_id; } } $length_undeleted_serv = count($undeleted_weds_serv); for($i=0; $i < $length_undeleted_serv; $i++){ if($undeleted_weds_serv[$i]){ echo "(未删除服务器文件) ".$undeleted_weds_serv[$i]."<br>"; $sql_undeleted_weds_serv = "SELECT * FROM `weddings` WHERE `id` = '$undeleted_weds_serv[$i]'"; $result_undeleted_weds_serv = mysqli_query($con, $sql_undeleted_weds_serv); while($record = mysqli_fetch_array($result_undeleted_weds_serv)){ $male_name = $record['male_name']; $female_name = $record['female_name']; $db_file = $record['fis']; // 数据库中的文件名(服务器上文件名一致) $filename_without_ext = substr($db_file, 0, strrpos($db_file, ".")); echo "<br><br>   ❌ <i>".$male_name."</i> 和 <i>".$female_name."</i> 对应的文件删除失败 <font color='#f26b1e'> ⇒ 错误码:<b>".$filename_without_ext."_SRV"."</b></font>"."⚠️"; } if (mysqli_num_rows($result_undeleted_weds_serv) > 0) { while ($row = mysqli_fetch_assoc($result_undeleted_weds_serv)) { echo "id: " . $row["id"] . " - Name: " . $row["name"] . "<br>"; } } else { echo "0 results"; } }else{ echo "<br>   ✅ <i>".$male_name."</i> 和 <i>".$female_name."</i> 已删除 (".$db_file.") <br><br>"; } }
问题根源与修复方案
1. 核心变量未定义
代码中$wed_id未赋值,遍历$_GET时用$id_casat作为记录ID,但后续操作都使用未定义的$wed_id,导致存储到数组的值为null,查询数据库时无法找到对应记录。
修复:
在遍历循环开头添加变量赋值:
foreach ($_GET as $id_casat => $fisier) { $wed_id = $id_casat; // 将复选框的id赋值给$wed_id // 后续代码保持不变 }
2. 数据库字段名错误
查询时使用$record['fis'],但表中实际字段为file,导致无法获取文件名。
修复:
将$db_file = $record['fis'];改为:
$db_file = $record['file'];
3. 结果集重复读取问题
while(mysqli_fetch_array(...))已读取完结果集,后续mysqli_num_rows判断后再读取时,结果集指针已到末尾,无法获取数据。
修复:
调整查询后逻辑,先判断结果集行数再读取:
if($undeleted_weds_serv[$i]){ echo "(未删除服务器文件) ".$undeleted_weds_serv[$i]."<br>"; $sql_undeleted_weds_serv = "SELECT * FROM `weddings` WHERE `id` = '$undeleted_weds_serv[$i]'"; $result_undeleted_weds_serv = mysqli_query($con, $sql_undeleted_weds_serv); if (mysqli_num_rows($result_undeleted_weds_serv) > 0) { while($record = mysqli_fetch_array($result_undeleted_weds_serv)){ $male_name = $record['male_name']; $female_name = $record['female_name']; $db_file = $record['file']; $filename_without_ext = substr($db_file, 0, strrpos($db_file, ".")); echo "<br><br>   ❌ <i>".$male_name."</i> 和 <i>".$female_name."</i> 对应的文件删除失败 <font color='#f26b1e'> ⇒ 错误码:<b>".$filename_without_ext."_SRV</b></font> ⚠️"; } } else { echo "<br>   ⚠️ 未找到对应记录"; } }
4. 成功分支变量未初始化
else分支中使用的$male_name、$female_name、$db_file仅在失败分支的while循环中定义,成功时会显示空值。建议在删除操作前提前查询记录信息并存储。
优化:
// 提前存储所有待删除记录的信息 $records = []; foreach ($_GET as $id_casat => $fisier) { $sql_get = "SELECT * FROM weddings WHERE id = $id_casat"; $res_get = mysqli_query($con, $sql_get); $records[$id_casat] = mysqli_fetch_assoc($res_get); // 后续删除操作... } // 后续展示时直接从$records数组获取 if($undeleted_weds_serv[$i]){ $wed_id = $undeleted_weds_serv[$i]; $male_name = $records[$wed_id]['male_name']; $female_name = $records[$wed_id]['female_name']; $db_file = $records[$wed_id]['file']; // ... 输出逻辑 }
5. 安全性优化
直接拼接SQL语句存在注入风险,改用预处理语句:
// 删除数据库记录 $stmt = mysqli_prepare($con, "DELETE FROM weddings WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $wed_id); mysqli_stmt_execute($stmt); if(mysqli_stmt_affected_rows($stmt) > 0){ $db_deleted_weds[] = $wed_id; $db_undeleted_weds[] = 0; }else{ $db_undeleted_weds[] = $wed_id; } mysqli_stmt_close($stmt); // 查询记录 $stmt = mysqli_prepare($con, "SELECT * FROM weddings WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $wed_id); mysqli_stmt_execute($stmt); $result_undeleted_weds_serv = mysqli_stmt_get_result($stmt);
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

