PHP中$_POST判断恒为true?图片上传表单需单次执行逻辑
解决PHP表单中$_POST判断始终为true且控制逻辑仅执行一次的问题
嘿,我来帮你捋清楚这个问题!首先得搞明白为什么你的!empty($_POST['?upload_img'])总是返回true——其实原因很简单:只要你点击了提交按钮,不管有没有选文件,这个按钮的name(?upload_img)都会被塞进$_POST数组里,它的值就是按钮上的文字"Upload Image"。既然这是个非空字符串,empty()检查肯定返回false,那!empty()自然就一直是true了。
接下来咱们一步步解决这两个问题:
1. 修正表单提交的判断逻辑
咱们不能只判断提交按钮有没有被触发,得同时确认表单确实通过POST提交,而且文件真的被成功上传了。另外建议把提交按钮的name改成更规范的名字(比如upload_img,去掉开头的问号——虽然PHP支持带特殊字符的键,但实在没必要给自己添乱)。
修改后的判断逻辑要结合$_FILES数组来做,这才是检查文件上传的正确姿势:
<?php // 先判断表单是POST提交,且提交按钮被点击 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_img'])) { // 检查文件是否有效上传:存在、无错误、大小大于0 if (isset($_FILES['input_img']) && $_FILES['input_img']['error'] === UPLOAD_ERR_OK && $_FILES['input_img']['size'] > 0) { echo "文件上传成功,执行你的业务逻辑<br>"; // 这里写你的上传处理代码,比如move_uploaded_file()移动文件等 // 关键一步:执行完逻辑后重定向,避免刷新重复提交 header("Location: " . $_SERVER['PHP_SELF']); exit; } else { echo "请选择一个有效的文件再上传哦<br>"; } } ?>
2. 调整表单代码
把提交按钮的name改成规范的upload_img,保持enctype='multipart/form-data'(这个你已经写对了,必须保留,不然文件传不上去):
<html> <body> <form action='' method='post' enctype='multipart/form-data'> <input type='file' name='input_img' id='input_img'><br> <input type='submit' value='Upload Image' name='upload_img'> </form> </body> </html>
3. 让逻辑仅执行一次的核心:Post/Redirect/Get模式
上面代码里的header("Location: " . $_SERVER['PHP_SELF']);是关键中的关键!当表单处理完成后,我们重定向回当前页面,这样用户刷新页面时,浏览器会发送GET请求,而不是重复发送POST请求,自然就不会重复执行上传逻辑了——完美解决重复执行的问题。
最后再给你几个小提醒:
- 检查文件上传时,一定要用
$_FILES['input_img']['error'],它能告诉你上传过程中有没有出问题(比如文件太大、临时目录写不了等),比只看文件大小靠谱多了。 - 别用
sizeof($_POST) > 0来判断表单是否提交,因为哪怕没选文件,只要点了提交,$_POST里也会有提交按钮的键值对,这个判断还是会一直为true。 - 尽量别用带特殊字符的键名,容易搞混,用字母、数字、下划线组成的名字就好。
内容的提问来源于stack exchange,提问作者macourtney7
相关产品推荐
相关产品推荐

