用$_POST还是$_GET取决于form的method属性:post对应$_POST,get对应$_GET;敏感操作强制用POST,搜索分页可用GET;须用filter_input等安全获取并验证字段,禁用$_REQUEST。

PHP 表单数据用 $_POST 还是 $_GET?看提交方式
表单数据接收方式取决于 HTML 中 的 method 属性。用 method="post" 就读 $_POST,用 method="get" 就读 $_GET。两者不能混用——比如表单设了 post,却去读 $_GET['username'],结果一定是 undefined index 错误。
实际建议:登录、注册、上传等涉及敏感或较大数据的场景,强制用 POST;搜索、分页等只传简单参数的场景可用 GET(参数会出现在 URL 中,可书签化)。
怎么安全地获取并验证表单字段?别直接用 $_POST['xxx']
直接访问 $_POST['email'] 会触发 Notice(如果字段没提交),也可能被注入恶意内容。必须先检查是否存在、再过滤。
- 用
isset($_POST['email'])或更稳妥的array_key_exists('email', $_POST)判断字段是否提交 - 用
filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL)做基础清洗(比trim()+htmlspecialchars()更语义明确) - 验证逻辑单独写,比如邮箱用
filter_var($email, FILTER_VALIDATE_EMAIL),手机号用正则匹配
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
if ($email && filter_var($email, FILTER_VALIDATE_EMAIL)) {
// 邮箱合法,可入库或发信
} else {
echo "邮箱格式不正确";
}
$_REQUEST 能不能偷懒用?不推荐
$_REQUEST 是 $_GET、$_POST 和 $_COOKIE 的合并数组,看似方便,但隐患明显:
立即学习“PHP免费学习笔记(深入)”;
- 同名字段时行为不可控(默认按
php.ini中request_order设置决定优先级,常见是 GPC 顺序) - 调试困难:你不知道值到底来自 URL、表单还是 Cookie
- 安全审计工具会报警告,很多团队禁止使用
明确知道来源就只用对应超全局变量,这是最清晰、最易维护的做法。
中文乱码、空值、数组字段怎么处理?
常见问题不是“收不到”,而是“收到但不对”:
- HTML 页面没声明 UTF-8:
缺失会导致中文变问号 - 表单含多选框(
)时,PHP 自动转成数组,但若全未勾选,$_POST['hobby']根本不存在,不是空数组 - 用户没填某字段,
$_POST['phone']不存在,直接strlen($_POST['phone'])会报错
统一用 filter_input + 默认值兜底最稳:
$hobbies = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY) ?: []; $phone = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_STRING) ?: '';
真正麻烦的是嵌套结构和文件上传——那已经超出“接收数据”范畴,得进 $_FILES 和 move_uploaded_file() 的逻辑了。











