PHP新增文章功能if...elseif仅命中第一个分支问题排查求助
问题根源
PHP 中只要表单包含对应名称的文件上传字段,提交时 $_FILES['image'] 就一定会被创建,isset($_FILES['image']) 永远返回 true,哪怕用户没有选择任何文件上传。此时 $_FILES['image'] 是包含错误信息的数组(error 字段值为 UPLOAD_ERR_NO_FILE,对应数值4),并非空值,所以你写的 empty($_FILES['image']) 判断也永远不成立,逻辑自然只会进入第一个分支。
修复方案
第一步:修改分支判断逻辑
将原有的分支条件替换为基于文件上传错误码的判断,这是PHP判断文件是否成功上传的标准方式,同时可以把重复的必填字段校验提前,简化代码:
elseif ($_GET['action'] == 'addPost') { // 公共必填字段判断提前,避免重复编写 if (!empty($_POST['redactor']) && !empty($_POST['title']) && !empty($_POST['content'])) { // 判断用户确实上传了有效文件 if ($_FILES['image']['error'] === UPLOAD_ERR_OK) { $res = checkFile($_FILES['image']); if ($res == true) { addPost($_POST['redactor'], $_POST['title'], $_POST['content'], $_FILES['image']['name']); } else { echo $imageError; } } // 判断用户没有上传文件 elseif ($_FILES['image']['error'] === UPLOAD_ERR_NO_FILE) { addPost($_POST['redactor'], $_POST['title'], $_POST['content'], NULL); } // 可扩展其他异常场景处理,比如上传失败、文件超出php.ini限制等 else { echo "文件上传出错,请重试"; } } }
可选优化:给checkFile函数加前置校验
避免异常场景下传入无效文件参数导致报错:
function checkFile($data) { // 新增前置判断,确认是有效上传文件 if (!is_array($data) || $data['error'] !== UPLOAD_ERR_OK) { global $imageError; $imageError = "无效的文件上传请求"; return false; } // 原有逻辑保持不变 global $imageError; $imageError = ""; $allowed = array("jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png"); $filename = $data["name"]; $filetype = $data["type"]; $filesize = $data["size"]; // 校验文件扩展名 $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!array_key_exists($ext, $allowed)) $imageError .= '请选择合法的文件格式。'; // 校验文件大小,最大5MB $maxsize = 5 * 1024 * 1024; if($filesize > $maxsize) $imageError .= ' 文件大小超出限制。'; // 校验文件MIME类型 if(in_array($filetype, $allowed)){ move_uploaded_file($data["tmp_name"], "./public/img/" . $data ["name"]); return true; } else { $imageError .= " 请重试。"; return false; } }
内容的提问来源于stack exchange,提问作者Luckyluchie
相关产品推荐
相关产品推荐

