为什么PHP无法获取HTML表单提交的POST数据且输出为NULL?
代码问题排查与修正
已复现的异常现象
- 直接访问
post.php时输出结果为NULL - 在校验逻辑前执行
var_dump($_POST['name'])返回空值 - 收到的邮件无有效内容,仅输出字面的
$contenido文本
触发异常的具体代码错误
- 调试语句语法错误:原代码写的
var_dump($_POST[]);,PHP中输出整个POST数组的正确写法是var_dump($_POST),空方括号的写法会触发语法错误,导致后续逻辑无法正常执行 - 变量赋值逻辑错位:
$headers的赋值语句没有闭合,原代码在写了"From: mi@cuentadeemail.com" . "\r\n" .后直接换行写下一个变量$contenido,相当于把两个变量的赋值拼接成了同一段表达式,赋值逻辑完全混乱 - 函数传参变量名不匹配:调用
mail()函数时传的主题参数是未定义的$subject,代码中实际存储主题值的变量是$asunto,变量名不一致会直接触发未定义警告,导致邮件内容生成异常 - 入参校验逻辑不严谨:原代码校验时对
subject、message两个字段没有显式判断isset(),如果请求被绕过前端校验直接发送缺字段的POST请求,会触发未定义索引的警告 - 跳转逻辑缺终止语句:执行
header("Location: index.html")后没有加exit,会导致后续代码继续执行,影响跳转效果 - 没有做请求方式判断:直接在脚本最外层输出调试内容,当用GET方式直接访问
post.php时,本来就不存在POST字段,自然会输出空值
修正后的可运行代码
post.php 完整代码
<?php // 仅处理POST提交的逻辑,避免直接访问文件时触发异常 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 调试阶段可打开下面的语句确认接收到的POST数据 // var_dump($_POST); // 统一校验所有必填字段 $requiredFields = ['name', 'email', 'subject', 'message']; $formValid = true; foreach ($requiredFields as $fieldName) { if (!isset($_POST[$fieldName]) || empty(trim($_POST[$fieldName]))) { $formValid = false; break; } } if ($formValid) { $destino = "contacto@mail.com"; $nombre = trim($_POST["name"]); $correo = trim($_POST["email"]); $asunto = trim($_POST["subject"]); $mensaje = trim($_POST["message"]); // 正确闭合邮件头赋值 $headers = "From: mi@cuentadeemail.com" . "\r\n" . "Reply-To: " . $correo . "\r\n" . "X-Mailer: PHP/" . phpversion(); // 正确拼接邮件正文内容 $contenido = "Nombre: " . $nombre . "\nCorreo: " . $correo . "\nAsunto: " . $asunto . "\nMensaje: " . $mensaje; // 传入正确的主题变量调用邮件发送函数 mail($destino, $asunto, $contenido, $headers); // 跳转后必须终止脚本执行 header("Location: index.html"); exit; } } ?>
前端表单代码(无需修改)
<form id="main-contact-form" name="contact-form" method="post" action="post.php"> <div class="row wow fadeInUp" data-wow-duration="1000ms" data-wow-delay="300ms"> <div class="col-sm-6"> <div class="form-group"> <input type="text" id="name" name="name" class="form-control" placeholder="Nombre" required="required"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input type="email" id="email" name="email" class="form-control" placeholder="Email" required="required"> </div> </div> </div> <div class="form-group"> <input type="text" id="subject" name="subject" class="form-control" placeholder="Asunto" required="required"> </div> <div class="form-group"> <textarea name="message" id="message" class="form-control" rows="4" placeholder="Mensaje" required="required"></textarea> </div> <div class="form-group"> <button type="submit" class="btn-submit">Enviar</button> </div> </form>
内容的提问来源于stack exchange,提问作者camilogrifi
相关产品推荐
相关产品推荐

