PHP用$_POST和$_GET接收表单数据须严格匹配HTML的method属性:POST用$_POST['name'],GET用$_GET['name'];name属性缺失、配置限制或未过滤输入是常见错误根源。

PHP怎么用$_POST和$_GET接收表单数据
直接看请求方法:HTML表单的method属性决定PHP该用哪个超全局变量。设为post就查$_POST,设为get就查$_GET——不是“都可以用”,也不是“自动识别”。$_REQUEST虽能混读,但不推荐,它依赖php.ini中request_order配置,行为不稳定。
-
→ 必须用$_POST['field_name']取值 -
→ 必须用$_GET['field_name']取值 - 表单没写
method,默认是GET,容易误以为提交成功但数据全在URL里暴露 - 含文件上传的表单必须用
POST,且要加enctype="multipart/form-data"
为什么$_POST取不到值?常见断点排查
不是代码写错,往往是环境或配置卡住。最常踩的坑是没检查表单name属性——id或class无效,PHP只认name。
- 浏览器开发者工具里确认表单实际提交的URL和参数(Network → Form Data 或 Query String)
- PHP脚本开头加
var_dump($_POST);或print_r($_GET);,看数组是否为空或结构异常 - 检查
php.ini中post_max_size和max_input_vars是否过小(尤其多复选框或动态字段时) - Apache下若启用了
mod_security,可能拦截含特殊字符(如)的POST内容,返回403但无提示
安全处理前必须做这三件事
直接把$_POST或$_GET内容echo到页面、拼SQL、写文件,等于敞开大门。过滤不能靠“用户不会乱输”。
- 用
isset()或array_key_exists()判断键是否存在,避免Notice: Undefined index - 用
filter_input()替代裸读:filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL)比trim($_POST['email'])更可靠 - 输出到HTML前必须用
htmlspecialchars(),否则XSS漏洞立现;入库前用预处理语句(PDO/MySQLi),别拼字符串
复选框、下拉多选这些“可能不存在”的字段怎么处理
复选框未勾选时,整个name根本不会出现在$_POST里,不是null也不是空字符串——这是最容易导致逻辑错乱的地方。
立即学习“PHP免费学习笔记(深入)”;
- 复选框组统一用数组名:
,PHP自动转成$_POST['hobby']数组 - 判断是否存在用
isset($_POST['hobby']),再用is_array()确认类型,避免foreach报Warning - 下拉多选(
)同理,name必须带[],否则只传最后一个选中的值 - 如果想让“未选”也传一个默认值,可加隐藏域:
Undefined index警告或空数组遍历时崩溃,问题不在语法,而在没理解HTTP表单提交机制本身是稀疏的——它只发你勾选/填写的内容,其余字段天然缺席。











