游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
PHP传入参数老踩坑?三种实用方法一次性学会

这篇文章就把向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=truesecure=true,才彻底解决问题。这俩属性是Cookie安全的关键,一定要加!