如何用两个浏览按钮与单个提交按钮实现PHP+MySQLi双图片上传
实现单次提交上传两张图片到数据库(基于mysqli)
当然可以实现!其实核心思路就是把你单图上传的逻辑分别套用到两个文件字段上,再配合正确的表单设置和数据库操作就搞定了。我帮你一步步调整代码:
第一步:修正HTML表单
你的原表单缺少两个关键属性,没有它们根本无法上传文件:
method="post":文件上传必须用POST方法enctype="multipart/form-data":告诉服务器这是包含文件的表单数据
修改后的HTML代码:
<!DOCTYPE html> <html> <body> <form action="action_page.php" method="post" enctype="multipart/form-data"> Your image: <input type="file" name="img" required><br/> Your Id card: <input type="file" name="img2" required> <input type="submit" name="publish" value="upload"> </form> </body> </html>
我还加了required属性,确保用户必须选择两张图片才能提交
第二步:PHP处理逻辑(action_page.php)
我们把单图上传的逻辑复制一份,分别处理img和img2字段,然后将上传成功的文件路径存入数据库(推荐存路径而非二进制数据,更高效)。
<?php // 1. 初始化上传配置 $uploadDir = "uploads/"; // 如果上传目录不存在,创建它(权限设置为755) if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } $uploadOk = 1; $imgPath = ""; $idCardPath = ""; // 2. 处理用户照片(img字段) if (isset($_FILES["img"]) && $_FILES["img"]["error"] == 0) { $imgFileName = basename($_FILES["img"]["name"]); // 给文件名加时间戳,避免重复覆盖 $uniqueImgName = time() . "_" . $imgFileName; $imgPath = $uploadDir . $uniqueImgName; $imageFileType = strtolower(pathinfo($imgPath, PATHINFO_EXTENSION)); // 检查是否为有效图片 $check = getimagesize($_FILES["img"]["tmp_name"]); if ($check === false) { echo "用户照片不是有效图片。"; $uploadOk = 0; } // 检查文件类型(只允许常见图片格式) if (!in_array($imageFileType, ["jpg", "jpeg", "png", "gif"])) { echo "用户照片仅支持JPG, JPEG, PNG & GIF格式。"; $uploadOk = 0; } // 检查文件大小(这里限制为2MB,可自行调整) if ($_FILES["img"]["size"] > 2 * 1024 * 1024) { echo "用户照片大小不能超过2MB。"; $uploadOk = 0; } // 如果检查通过,移动临时文件到上传目录 if ($uploadOk == 1) { if (!move_uploaded_file($_FILES["img"]["tmp_name"], $imgPath)) { echo "用户照片上传失败,请重试。"; $uploadOk = 0; } } } else { echo "请选择用户照片。"; $uploadOk = 0; } // 3. 处理身份证照片(img2字段),逻辑和上面一致 if ($uploadOk == 1 && isset($_FILES["img2"]) && $_FILES["img2"]["error"] == 0) { $idCardFileName = basename($_FILES["img2"]["name"]); $uniqueIdCardName = time() . "_idcard_" . $idCardFileName; $idCardPath = $uploadDir . $uniqueIdCardName; $idCardFileType = strtolower(pathinfo($idCardPath, PATHINFO_EXTENSION)); $check = getimagesize($_FILES["img2"]["tmp_name"]); if ($check === false) { echo "身份证照片不是有效图片。"; $uploadOk = 0; } if (!in_array($idCardFileType, ["jpg", "jpeg", "png", "gif"])) { echo "身份证照片仅支持JPG, JPEG, PNG & GIF格式。"; $uploadOk = 0; } if ($_FILES["img2"]["size"] > 2 * 1024 * 1024) { echo "身份证照片大小不能超过2MB。"; $uploadOk = 0; } if ($uploadOk == 1) { if (!move_uploaded_file($_FILES["img2"]["tmp_name"], $idCardPath)) { echo "身份证照片上传失败,请重试。"; $uploadOk = 0; } } } else if ($uploadOk == 1) { echo "请选择身份证照片。"; $uploadOk = 0; } // 4. 如果两张图片都上传成功,存入数据库(mysqli预处理语句,防止SQL注入) if ($uploadOk == 1) { // 替换成你的数据库连接信息 $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "your_database"; // 创建mysqli连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 使用预处理语句插入数据,避免SQL注入 $stmt = $conn->prepare("INSERT INTO user_images (user_photo, id_card_photo) VALUES (?, ?)"); $stmt->bind_param("ss", $imgPath, $idCardPath); if ($stmt->execute()) { echo "两张图片上传并保存到数据库成功!"; } else { echo "数据库保存失败: " . $stmt->error; // 如果数据库保存失败,删除已上传的文件 unlink($imgPath); unlink($idCardPath); } // 关闭连接 $stmt->close(); $conn->close(); } ?>
关键说明:
- 文件名唯一化:用
time()给文件名加前缀,避免不同用户上传同名文件导致覆盖 - 错误处理:每一步都做了错误检查,一旦某张图片上传失败就终止流程
- 安全防护:使用mysqli预处理语句插入数据,防止SQL注入;限制了文件类型和大小,避免恶意文件上传
- 回滚机制:如果数据库保存失败,会删除已经上传到服务器的图片,避免垃圾文件
内容的提问来源于stack exchange,提问作者Ronny
相关产品推荐
相关产品推荐

