You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&emsp;&emsp;&emsp;❌ <i>".$male_name."</i> 和 <i>".$female_name."</i> 对应的文件删除失败 <font color='#f26b1e'> &#8658; 错误码:<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>&emsp;&emsp;&emsp;✅ <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>&emsp;&emsp;&emsp;❌ <i>".$male_name."</i> 和 <i>".$female_name."</i> 对应的文件删除失败 <font color='#f26b1e'> &#8658; 错误码:<b>".$filename_without_ext."_SRV</b></font> ⚠️";
        }    
    } else {
        echo "<br>&emsp;&emsp;&emsp;⚠️ 未找到对应记录";
    }   
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:44:52