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
相关产品推荐
相关产品推荐

