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

PHP/MySQL单文件上传时数据重复插入问题求助

解决MySQL图片文件名重复插入的问题

我一眼就揪出问题所在啦——你的代码在循环结束后重复执行了文件信息的添加操作,这直接导致最后一个文件的记录被多插了一次:单张图片就变成两次,多张上传时最后一个文件会重复出现,这就是你看到重复条目的根源!

另外我还帮你调整了几个逻辑细节,让代码更健壮,下面是修复后的完整方案:

修复后的完整代码

include('koneksi.php');
date_default_timezone_set('Asia/Jakarta');

$id_user = $_POST['id_user'];
$caption = $_POST['caption'];
$files = [];
$errors = []; // 提前初始化错误数组,避免未定义警告

foreach($_FILES['files']['name'] as $i => $name) {
    $name = $_FILES['files']['name'][$i];
    $size = $_FILES['files']['size'][$i];
    $type = $_FILES['files']['type'][$i];
    $tmp = $_FILES['files']['tmp_name'][$i];
    
    $explode = explode('.', $name);
    $ext = end($explode);
    $updatdName = $explode[0] . time() . '.' . $ext;
    $path = 'gallery/' . basename($updatdName);

    // 检查是否选择了文件
    if(empty($tmp)) {
        $errors[] = 'Please choose at least 1 file to be uploaded.';
        continue; // 跳过当前文件的后续检查
    }

    // 检查文件扩展名
    $allowed = array('jpg','JPG','jpeg','JPEG','gif','GIF','bmp','BMP','png','PNG');
    if(!in_array($ext, $allowed)) {
        $errors[] = 'The file <b>'.$name.'</b> extension is not allowed.';
        continue;
    }

    // 检查文件大小(2MB)
    $max_file_size = 1024*1024*2;
    if($size > $max_file_size) {
        $errors[] = 'The file <b>'.$name.'</b> size is too high.'; // 修正拼写错误:hight → high
        continue;
    }

    // 没有错误,准备上传
    if(!file_exists('gallery')) {
        mkdir('gallery', 0777, true); // 添加true支持递归创建目录,避免父目录不存在时失败
    }

    if(move_uploaded_file($tmp, $path)) {
        // 只有上传成功才添加到files数组
        $files['file_name'][] = $updatdName;
        $files['size'][] = $size;
        $files['type'][] = $type;
    } else {
        $errors[] = 'Something went wrong while uploading <b>'.$name.'</b>';
    }
}

// 处理错误输出
if(!empty($errors)) {
    foreach($errors as $error) {
        echo '<p>'.$error.'</p>';
    }
    exit; // 有错误就停止后续插入操作
}

// 如果有上传成功的文件,插入数据库
if(!empty($files)) {
    $names = implode(',', $files['file_name']);
    $sizes = implode(',', $files['size']);
    $types = implode(',', $files['type']);
    
    // 重要提醒:当前代码存在SQL注入风险,建议后续替换为mysqli预处理语句
    $sql = "INSERT into status VALUES(NULL, '$id_user', '$names','$caption','foto',NOW()); ";
    mysqli_query($koneksi, $sql);
    
    // 跳转放在插入成功后,避免循环中提前跳转导致只处理第一个文件
    echo '<script>window.history.back()</script>';
}

关键修复点说明

  • 移除重复添加代码:删掉了if(!empty($files))块里重复push文件信息的三行代码,这是解决重复插入的核心。
  • 优化错误处理:提前初始化错误数组,有错误时直接终止后续操作,避免无效的数据库插入。
  • 调整逻辑顺序:只有文件上传成功后才将信息加入数组,确保数据库只记录真正上传成功的文件。
  • 修正细节问题:修复了拼写错误,添加递归创建目录的支持,把跳转语句移到所有文件处理完成后。
  • 安全提醒:当前代码直接拼接POST参数到SQL语句中,存在SQL注入风险,建议后续改用mysqli预处理语句来提升安全性。

这样修改后,单张图片只会存储一次,多张图片会按上传顺序正常存储为A.jpg,B.jpg,C.jpg的格式啦!

内容的提问来源于stack exchange,提问作者Lamberto Fredrick Nababan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:16