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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:57:22