使用PHPMailer时$_POST变量解析为空的原因排查
问题原因及解决方案
核心原因1:提交数据格式与解析方式不匹配
你用json_decode(file_get_contents('php://input'), true)覆盖$_POST,但如果表单是常规HTML表单提交(默认Content-Type: application/x-www-form-urlencoded或multipart/form-data),php://input返回的是类似submit=&key=value的URL编码字符串,而非JSON格式。此时json_decode会返回null,导致$_POST被赋值为空数组或null,自然无法通过!empty($_POST['submit'])的判断。
核心原因2:submit字段值为空触发empty判定
即使数据解析正常,由于开发者工具显示submit字段值为空,empty($_POST['submit'])会返回true,!empty($_POST['submit'])则为false,直接跳过邮件发送逻辑。
解决方案
匹配数据格式与解析方式
- 如果是常规表单提交,删除
$_POST = json_decode(file_get_contents('php://input'), true);这行代码,PHP会自动将表单数据解析到$_POST中。 - 如果确实需要用JSON格式提交,确保前端发送请求时设置
Content-Type: application/json,并且提交的是标准JSON字符串(比如{"submit": "", "name": "xxx"})。
- 如果是常规表单提交,删除
调整submit字段的判断逻辑
- 若submit字段值本身为空,可改用
isset($_POST['submit'])判断字段是否存在,而非!empty():if(isset($_POST['submit'])) { // 邮件发送逻辑 } - 或者给submit按钮设置具体值,比如
<button type="submit" name="submit" value="send">发送</button>,这样$_POST['submit']会有值,!empty()判断就能通过。
- 若submit字段值本身为空,可改用
避免重复读取php://input
php://input是一次性可读流,若代码中其他地方已经读取过它,再次读取会得到空内容,导致json_decode解析失败。确保只有一次读取操作。
内容的提问来源于stack exchange,提问作者xbass540
相关产品推荐
相关产品推荐

