PHP表单数据必须用$_POST或$_GET显式获取,严格匹配method属性和name值;中文需UTF-8全链路编码;空值须用isset()等校验,禁用$_REQUEST。

表单 action 和 method 必须匹配 PHP 接收方式
浏览器提交表单时,只靠 <form> 的 action 和 method 决定数据怎么发。PHP 后台不会“自动识别”字段,它只看 HTTP 方法和请求体结构。
常见错误:表单写 method="get",PHP 却查 $_POST;或 action 指向了不存在的 PHP 文件路径(比如漏了 .php 后缀),导致 404 而不是报错。
-
method="post"→ PHP 用$_POST读取(推荐用于含敏感/较长数据的场景) -
method="get"→ PHP 用$_GET读取(URL 可见、有长度限制,适合筛选参数) -
action必须是可访问的 PHP 脚本路径,如action="handle.php",且该文件需在 Web 服务器(如 Apache/Nginx)根目录下运行
PHP 端必须校验 $_POST 是否存在再取值
直接访问 $_POST['username'] 会触发 Notice: Undefined index 错误(尤其表单未提交或字段名拼错时)。PHP 不会因为表单没发就默认跳过这行。
正确做法是先用 isset() 或 !empty() 判断字段是否存在且非空:
立即学习“PHP免费学习笔记(深入)”;
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
$email = isset($_POST['email']) ? filter_var($_POST['email'], FILTER_SANITIZE_EMAIL) : '';
if (!$username || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
die('用户名或邮箱格式不合法');
}
// 继续处理……
}
?>
- 永远别跳过
$_SERVER['REQUEST_METHOD']检查——否则 PHP 脚本可能被直接 GET 访问而执行逻辑 -
trim()防空格干扰,filter_var()比正则更稳妥地做基础过滤 - 不要用
$_REQUEST,它混杂 GET/POST/COOKIE,语义不清、易被绕过
表单字段 name 属性是 PHP 读取的唯一依据
HTML 表单里,id 或 class 对 PHP 完全无效;只有 name 的值会变成 $_POST 数组的键名。
典型翻车点:
- 写成
<input id="email">却忘了加name="email"→ PHP 收不到这个字段 - 复选框(
<input type="checkbox">)未勾选时不会发送,PHP 中该name根本不存在,不能假设它为''或false - 多个同名复选框要加
[],如name="hobby[]",PHP 才会收到数组$_POST['hobby']
示例正确写法:
<form method="post" action="handle.php">
<input type="text" name="username" required>
<input type="email" name="email" required>
<input type="checkbox" name="hobby[]" value="reading">阅读
<input type="checkbox" name="hobby[]" value="coding">编程
<button type="submit">提交</button>
</form>
中文乱码通常卡在三处:HTML 声明、PHP 输出、数据库连接
表单提交中文后 PHP 显示 ,问题往往不在提交本身,而是编码链断了一环。
- HTML 页面必须声明 UTF-8:
<meta charset="UTF-8">(放在<head>中) - PHP 脚本开头加
header('Content-Type: text/html; charset=utf-8');,避免浏览器误判编码 - 如果存数据库,MySQL 连接需设字符集:
$pdo->exec("SET NAMES utf8mb4");或在 DSN 中加;charset=utf8mb4 - 不要依赖
mb_convert_encoding()临时转码——说明前面某环已经错了
最简验证法:在 PHP 中直接 var_dump($_POST),看终端输出是否为中文。如果是 ,说明问题出在 HTML 或 HTTP 响应头;如果显示正常但入库后变乱码,就是数据库环节没对齐。
实际部署时,php.ini 的 default_charset 设为 "UTF-8" 能减少很多隐性坑,但本地开发常被忽略。



















