PHP MVC架构下处方图片无法上传至SQL数据库的问题排查
处方图片无法上传至SQL数据库的问题排查与解决办法
核心错误点及修复方案
1. Controller与Model参数传递顺序完全错位
- 问题:Controller调用
$this->CustomerModel->upload_prescription_db($date, $cid, $pname, $message)时,参数顺序为date, cid, pname, message,但Model函数定义是public function upload_prescription_db($cid, $pname, $message, $date),导致数据库绑定的参数值完全错位(比如把日期传给用户ID字段),直接引发插入失败。 - 修复:按Model定义的顺序传参:
$r = $this->CustomerModel->upload_prescription_db($cid, $pname, $message, $date);
2. Controller变量错误与冗余代码
- 问题:错误引用
$_FILES["fileToUpload"]["name"](视图中文件输入框name为file),且存在未初始化的$filename和未使用的$target_file,引发无效取值和警告。 - 修复:删除冗余代码,统一使用
$_FILES["file"]:// 移除以下两行错误代码 // $pname = basename($_FILES["fileToUpload"]["name"]); // $target_file = $uploads_dir . $filename;
3. 未验证文件移动操作结果
- 问题:
move_uploaded_file可能因权限不足、路径错误失败,但当前代码未检查返回值,会导致数据库插入不存在的文件名。 - 修复:仅在文件移动成功时执行数据库插入:
if (move_uploaded_file($tname, $uploads_dir . '/' . $pname)) { $r = $this->CustomerModel->upload_prescription_db($cid, $pname, $message, $date); echo "<script>alert('处方上传成功');window.location.href='".URLROOT."/customers/home';</script>"; } else { echo "<script>alert('文件上传失败,请检查目录权限');</script>"; exit; }
4. 表单提交路径不匹配
- 问题:视图中form的
action为/Customers/upload_prescription_image,但Controller处理方法是upload_prescription_db,导致表单提交后无法触发正确逻辑。 - 修复:修改form的action为正确路径:
<form class="form" method="post" action="<?php echo URLROOT; ?>/Customers/upload_prescription_db" enctype="multipart/form-data">
5. 缺失文件大小验证
- 问题:视图提示最大5MB,但Controller未做大小检查,可能因php.ini限制或文件过大导致上传失败。
- 修复:添加文件大小验证:
$max_size = 5 * 1024 * 1024; // 5MB if ($_FILES["file"]["size"] > $max_size) { echo "<script>alert('Error: 文件大小不能超过5MB');window.history.back();</script>"; exit; }
6. 视图label与input关联错误
- 问题:第一个label的
for="prescription",但文件输入框未设置id="prescription",导致点击label无法触发文件选择。 - 修复:给文件输入框添加id:
<input type="File" class="button-prescription-upload" id="prescription" name="file" accept=".jpg, .jpeg, .png">
7. Controller未定义$data变量
- 问题:调用
$this->view('customers/home', $data);时,$data未定义,可能导致视图加载错误。 - 修复:初始化$data:
$data = []; $this->view('customers/home', $data);
修复后的完整代码示例
修复后的Controller
public function upload_prescription_db() { $this->CustomerModel = $this->model('Customer'); if (isset($_POST["submit"]) && !empty($_FILES["file"]["name"])) { $message = $_POST["message"]; $uploads_dir = 'C:\xampp\htdocs\careU_project\public\img\prescription'; $pname = rand(1000, 10000) . "-" . $_FILES["file"]["name"]; $tname = $_FILES["file"]["tmp_name"]; $date = date('Y-m-d H:i:s'); $cid = $_SESSION['user_ID']; // 验证文件类型 $file_type = strtolower(pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION)); if (!in_array($file_type, ["jpg", "jpeg", "png"])) { echo "<script>alert('Error: Only JPG, JPEG, and PNG files are allowed');window.history.back();</script>"; exit; } // 验证文件大小 $max_size = 5 * 1024 * 1024; if ($_FILES["file"]["size"] > $max_size) { echo "<script>alert('Error: 文件大小不能超过5MB');window.history.back();</script>"; exit; } // 移动文件并执行数据库插入 if (move_uploaded_file($tname, $uploads_dir . '/' . $pname)) { $r = $this->CustomerModel->upload_prescription_db($cid, $pname, $message, $date); $r ? echo "<script>alert('处方上传成功');window.location.href='".URLROOT."/customers/home';</script>" : echo "<script>alert('数据库插入失败,请检查配置');window.history.back();</script>"; } else { echo "<script>alert('文件上传失败,请检查目录权限');window.history.back();</script>"; exit; } } else { header("Location: ".URLROOT."/customers/home"); exit; } }
修复后的Model
public function upload_prescription_db($cid, $pname, $message, $date) { $this->db->query("INSERT into customer_prescription VALUES(DEFAULT,:cid,:pname,:message,:date)"); $this->db->bind(':cid', $cid); $this->db->bind(':pname', $pname); $this->db->bind(':message', $message); $this->db->bind(':date', $date); return $this->db->execute(); }
修复后的View
<div class="form-div form-div-outer"> <div class="form-div"> <div class="img-prescription"> <img class="img" src="<?php echo URLROOT; ?>/public/img/customer/prescription.png" alt="prescription"> <h2>Upload Prescription</h2> </div> <form class="form" method="post" action="<?php echo URLROOT; ?>/Customers/upload_prescription_db" enctype="multipart/form-data"> <label for="prescription" class="label-upload">Doctor's Prescription<span class="required">*</span> (Maxium upload size 5Mb)</label><br> <div class="div-prescription-upload"> <input type="File" class="button-prescription-upload" id="prescription" name="file" accept=".jpg, .jpeg, .png"> </div><br> <label for="message" class="label-upload">Your Message</label><br> <textarea class="prescription-textarea" rows="10" cols="70" id="message" name="message"></textarea><br> <input type="submit" name="submit" value="Send" class="button-submit"> </form> </div> </div>
内容的提问来源于stack exchange,提问作者Pirunthapan
相关产品推荐
相关产品推荐

