PHP POST表单上传文件报错:Undefined array key 'attestat'
问题排查与修复方案
核心问题:表单缺少文件上传必需属性
HTML表单上传文件时,必须添加enctype="multipart/form-data"属性,否则PHP无法接收$_FILES数组中的文件数据,这就是你看到Undefined array key "attestat"警告的直接原因。
修复后的HTML代码
<form action="submit.php" method="POST" enctype="multipart/form-data"> <div class="file-input"> <input type="file" class="attestat" id="attestat" name="attestat" accept="application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, image/*" multiple="multiple"> <span class="file-name">Выберите файл</span> </div> <!-- 需添加提交按钮触发表单提交 --> <button type="submit">上传文件</button> </form>
其他关键问题修复
1. 临时文件路径无法直接存储
$_FILES["attestat"]["tmp_name"]是PHP临时文件路径,脚本执行完毕后该文件会被自动删除,直接存入数据库无意义,需先读取文件内容再存储,或存储文件到服务器目录后记录路径。
2. 存在SQL注入风险
原代码直接将变量拼接进SQL语句,需改用预处理语句规避漏洞。
3. 多文件上传的结构处理
因添加了multiple="multiple"属性,$_FILES会变为多维数组,需循环处理每个文件。
修复后的PHP代码
<?php $servername = "localhost"; $username = "root"; $password = "Youshit21"; $dbname = "medacc"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 判断是否有文件上传且无错误 if (isset($_FILES["attestat"]) && $_FILES["attestat"]["error"][0] == UPLOAD_ERR_OK) { // 循环处理多文件 foreach ($_FILES["attestat"]["tmp_name"] as $key => $tmp_name) { // 读取文件内容 $fileContent = file_get_contents($tmp_name); // 转义内容防止注入 $fileContent = $conn->real_escape_string($fileContent); $id = uniqid('user_'); // 使用预处理语句 $stmt = $conn->prepare("INSERT INTO medacc.spaco(id, filo) VALUES (?, ?)"); $stmt->bind_param("ss", $id, $fileContent); if ($stmt->execute()) { echo "文件上传成功<br>"; } else { echo "Error: " . $stmt->error . "<br>"; } $stmt->close(); } } else { echo "未选择有效文件或上传出错"; } $conn->close(); ?>
说明:数据库字段
filo需设置为LONGBLOB类型以存储文件内容;若选择存储文件路径,可将文件移动至服务器指定目录,再将路径存入数据库。
额外检查项
- 确认PHP配置中
upload_max_filesize和post_max_size参数值足够容纳待上传文件 - 检查服务器临时目录(
upload_tmp_dir)是否具备读写权限
内容的提问来源于stack exchange,提问作者Destinovic
相关产品推荐
相关产品推荐

