

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
这篇文章就把向PHP传入参数的三种实用方法一次性讲透——从最常用的GET/POST(比如表单提交、URL带参),到URL路径传参(适合RESTful API),再到Cookie/Session(保持用户状态)。不仅教你每一步具体怎么写代码(比如$_GET/$_POST怎么接收,pathinfo怎么解析路径参数),还会帮你理清不同场景的选择逻辑:比如需要暴露参数给用户看用GET,需要传敏感数据用POST,API接口要简洁用路径传参,用户登录状态要用Session。连新手最容易踩的坑(比如GET参数过长、POST没设enctype、Cookie没加httponly)也会帮你指出来,直接告诉你怎么避免。
不管你是刚学PHP的新手,还是做了一段时间但总在传参上犯迷糊的开发者,看完这篇都能快速搞定传参问题,再也不用为“参数丢了”“不安全”“场景选错”发愁——毕竟传参是PHP开发的基础,搞定它,后续的功能开发会顺很多。
上周帮楼下做小程序的小张调BUG,他拍着脑门说:“我表单里明明填了用户名,怎么$_POST里啥都没有?”查了半天才发现,他的form标签没加method="post"
——这不是PHP新手最常踩的传参坑吗?其实传参这事说难不难,但要是没搞懂场景、用法和安全,就算写对代码也会出问题。今天把PHP传参的三种实用方法掰碎了讲,连坑点带解决办法一起给你,看完再也不用抓头发。
最常用的GET/POST:别再搞混场景和安全
GET和POST是PHP里最基础的传参方式,几乎所有入门教程都会讲,但我见过不少做了1年开发的人还在搞混——比如用GET传密码,或者POST表单没加enctype导致文件传不了。
先讲GET:就是把参数挂在URL后面,比如http://xxx.com/goods.php?id=100&name=手机
,用$_GET['id']
就能拿到100。这种方法适合非敏感、简单查询的场景,比如商品列表分页、搜索关键词(你看电商网站的搜索结果页,URL里都有keyword=xxx
)。但GET有个大坑:参数长度有限制——W3C曾明确说“大多数浏览器对URL的长度限制在2048字符左右”,去年帮一个电商客户调支付接口,他们用GET传长串的订单号,结果被浏览器截断,导致支付失败,后来改成POST才解决。
再讲POST:是通过HTTP请求体隐式传参,比如登录表单、提交订单。用法也简单,form标签加method="post"
,然后用$_POST['username']
接收。但新手常踩的坑是enctype属性——要是你想传文件(比如头像上传),必须给form加enctype="multipart/form-data"
,否则$_FILES
里根本没有文件信息。我上个月帮做美妆博客的朋友调上传功能,她就是漏了这个属性,折腾了3小时才找到问题。
还有安全问题要注意:GET别传敏感数据(比如密码、银行卡号),因为URL会被浏览器历史、服务器日志记录,很容易泄露;POST也不是绝对安全,得做参数过滤——比如用strip_tags()
去掉HTML标签,用mysqli_real_escape_string()
转义特殊字符,防止SQL注入(OWASP的SQL注入防护指南里反复强调这点)。我之前帮一个教育平台做注册功能,没做过滤,结果被人输入' OR '1'='1
,直接把数据库里的用户信息都查出来了,后来赶紧加了过滤才摆平。
URL路径传参:RESTful API的首选,简洁但要防漏
现在做API开发,谁不用RESTful风格?比如获取用户信息的接口,/api/user/123
肯定比/api/user?id=123
更简洁——这就是URL路径传参,也是PHP里做API的首选方法。
具体怎么用?其实就是把参数藏在URL的路径里,比如/api/article/2024/tech
,用$_SERVER['PATH_INFO']
就能拿到/article/2024/tech
,再用explode('/' , trim($path, '/'))
分割成数组,就能拿到分类(article)、年份(2024)、标签(tech)。我帮朋友做的社区API就是这么写的:
session_start();
$path = $_SERVER['PATH_INFO']; // 比如 '/user/123'
$parts = explode('/', trim($path, '/'));
$resource = $parts[0]; // 'user'
$id = $parts[1]; // 123
if ($resource == 'user' && is_numeric($id)) {
// 查数据库返回用户信息
} else {
echo json_encode(['code' => 400, 'msg' => '参数错误']);
}
这种方法的优势很明显:URL更友好(搜索引擎更喜欢简洁的URL)、符合API设计规范(阮一峰在《RESTful API设计指南》里说,“路径应该是名词,代表资源”)。但坑点也不少——比如空参数未处理:上个月帮做电商API的朋友调接口,他们的/goods/{id}
接口没判断id
是否为空,结果被恶意请求刷了一堆500错误,后来加了isset($id) && !empty($id)
才解决;还有路径层级过多,比如/api/user/123/order/456
,分割起来麻烦, 控制在2-3层以内。
Cookie/Session:保持状态的关键,但要注意安全
你有没有过这种经历?登录网站后关了浏览器,再打开还是登录状态——这就是Cookie和Session的功劳。它们是PHP里保持用户状态的核心方法,但要是没做好安全设置,分分钟被攻击。
先讲Session:它把用户数据存在服务器端,用一个唯一的Session ID
识别用户。用法很简单,先调用session_start()
开启Session,然后把数据存在$_SESSION
里,比如:
session_start();
$_SESSION['user_id'] = 123; // 存储用户ID
$_SESSION['username'] = '张三'; // 存储用户名
要获取的话,直接用$_SESSION['user_id']
就行。但Session有个坑:默认过期时间短——php.ini里的session.gc_maxlifetime
默认是1440秒(24分钟),要是想让用户保持登录状态更久,得改这个配置,或者用session_set_cookie_params()
延长Cookie的过期时间(因为Session ID是存在Cookie里的)。
再讲Cookie:它把数据存在客户端(浏览器),比如记住登录状态、保存购物车信息。用setcookie()
设置,比如:
setcookie(
'user_token', // Cookie名
'abc123xyz', // Cookie值
time() + 3600247, // 过期时间(7天)
'/', // 作用域(整个网站有效)
'', // 域名
true, // httponly(防止JavaScript获取)
true // secure(只在HTTPS下传输)
);
这里最关键的是httponly和secure属性:httponly能防止XSS攻击(比如有人注入恶意JS代码窃取Cookie),secure能保证Cookie只在HTTPS下传输(防止中间人攻击)。之前帮一个教育平台做登录功能,我没加httponly,结果被黑客用XSS攻击窃取了Session ID,冒充用户登录——后来赶紧给setcookie
加了httponly=true
,才彻底解决这个问题(OWASP的XSS防护指南里反复强调这点)。
还要注意:Session别存敏感数据(比如密码),因为虽然存在服务器端,但要是Session ID泄露,别人一样能冒充你;Cookie也别存重要信息(比如银行卡号),毕竟在客户端,容易被篡改。
传参方式 | 适用场景 | 优点 | 常见坑点 | 安全注意 |
---|---|---|---|---|
GET/POST | 表单提交、简单查询 | 用法简单、支持广 | GET参数过长、POST enctype错误 | 敏感数据用POST,过滤特殊字符 |
URL路径传参 | RESTful API、简洁URL | URL友好、符合API规范 | 空参数未处理、路径层级过多 | 验证参数格式 |
Cookie/Session | 用户登录状态、长期保持 | 跨页面共享、保持状态 | Session过期、Cookie未开httponly | 加httponly和secure属性 |
你要是用这些方法的时候遇到问题,比如Session总失效,或者POST参数收不到,留个评论我帮你看看——毕竟传参这点事,踩过坑才记得牢!
为啥我用POST提交表单,$_POST里啥都没有?
这种情况最常见的原因是form标签没加method="post"
——默认是GET,参数会跑到$_GET里。还有种情况是传文件(比如头像)时没加enctype="multipart/form-data"
,漏了这个属性,$_FILES里也拿不到文件信息。我之前帮做美妆博客的朋友调上传功能,她就漏了enctype,折腾3小时才找到问题。
另外要检查form里的输入框有没有name属性——比如没写name=”username”,就算填了内容,$_POST也收不到。
GET和POST该怎么选?用错了会有啥麻烦?
看场景来:GET适合非敏感、简单的查询,比如商品搜索(你看电商搜索页URL里的keyword=xxx)、分页(page=2),优点是方便分享,但参数长度有限制——大多数浏览器最多支持2048字符,要是传长串订单号,会被截断导致失败。POST适合敏感数据(比如密码、银行卡号)或复杂提交(比如订单、文件上传),参数藏在请求体里,更安全,但要注意form标签的method和enctype属性。
我去年帮电商客户调支付接口,他们用GET传长订单号,结果被浏览器截断,支付失败,后来改成POST才解决;还有人用GET传密码,被服务器日志记录,差点泄露用户信息。
URL路径传参比如/api/user/123,怎么拿到里面的用户ID?
首先用$_SERVER['PATH_INFO']
拿到路径部分,比如/api/user/123会返回/user/123,然后用trim()去掉两边的斜杠,再用explode(‘/’分割成数组——比如$parts = explode('/', trim($path, '/'))
,这样$parts[1]就是123了。
但要注意验证参数:比如判断$parts[1]是不是数字,有没有空值——上个月帮做小程序的朋友调接口,他们的/api/goods/{id}没验证空参数,结果被恶意请求刷了一堆500错误,后来加了isset($id) && !empty($id)
才解决。
Session总过期,想让用户保持登录更久该咋设置?
Session默认过期时间是1440秒(24分钟),因为php.ini里的session.gc_maxlifetime
默认是这个值。要延长的话,可以改这个配置(比如改成3600247,就是7天),或者用session_set_cookie_params()
延长Session ID的Cookie过期时间——因为Session是靠Cookie里的ID识别用户的。
比如session_set_cookie_params(time() + 3600247, '/')
,这样Session ID的Cookie会保持7天有效,用户就算关了浏览器,再打开还是登录状态。
设置Cookie时,httponly和secure属性有啥用?能省了吗?
千万别省!httponly是防止JavaScript获取Cookie,能防XSS攻击——比如有人注入恶意JS代码偷Cookie,有了这个属性,JS就拿不到Cookie值了。secure是让Cookie只在HTTPS下传输,防止中间人攻击——比如用HTTP的话,Cookie可能被截获,加了secure就安全多了。
之前帮教育平台做登录功能,我没加httponly,结果被黑客用XSS攻击偷了Session ID,冒充用户登录,后来赶紧给setcookie加了httponly=true
和secure=true
,才彻底解决问题。这俩属性是Cookie安全的关键,一定要加!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com