
本文专门针对新手痛点,用超详细的示例代码拆解这两种最常用的传值方式:从表单的GET/POST方法区别,到form标签的正确写法、$_POST变量的取值技巧;从URL带参数的格式(比如?id=1),到$_GET变量的使用场景,每一步都附可直接运行的代码,连“如何打印传递后的结果”都讲得清清楚楚。不用死记硬背概念,跟着示例敲一遍,就能快速掌握PHP传值的底层逻辑,解决开发中80%的基础数据传递问题。最后还加了新手必看的安全小提示(比如过滤特殊字符),避免踩坑。不管你是做简单的登录功能,还是列表页跳详情页,这篇“一看就会”的实操教程,都能帮你快速搞定传值难题。
你有没有过这样的情况?写了个登录表单,点提交后后台啥数据都没拿到,急得直挠头?或者做文章列表页,点“查看详情”后,页面一片空白——明明URL里带了id,后台却死活取不出来?我去年第一次做客户的会员系统时,就犯过超低级的错:form标签里没写method属性,默认用了GET,结果密码直接暴露在URL里,被客户骂得狗血淋头;还有一次做商品详情页,把URL里的?id=写成了&i=,导致所有链接都打不开,排查了半小时才发现是拼写错了。
这些坑我踩过,所以今天把我 的“笨办法”告诉你——不用记复杂概念,跟着做就能搞定PHP传值这件事,亲测有效。
表单传值:我用3步搞定,再也没丢过数据
先讲表单传值——这是PHP里最常用的传值方式,登录、注册、提交评论都得用它。我 了三个“必做项”,做对了数据肯定丢不了。
第一步:form标签的“三个必写项”
你写表单时,一定要给
加action、method,还要给每个输入框加name——我当初就是漏加name,导致后台拿不到数据。比如做登录表单,form标签得这么写:
第二步:后台用$_POST拿数据,先“验证”再使用
处理数据的PHP文件(比如handle_login.php)里,直接用$_POST[‘用户名’]就能拿到数据:
<?php // 拿用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];
// 先验证数据有没有传过来(我每次都这么做,避免报错)
if (empty($username) || empty($password)) {
echo "请填写完整信息!";
exit;
}
// 然后做验证,比如查数据库有没有这个用户
// ...
?>
要是你不确定数据有没有传过来,就加一行var_dump($_POST)
——直接打印所有传过来的数据,我每次写新表单都会先这么试,确保数据没丢。
第三步:搞懂GET和POST的区别,不用死记硬背
我之前也分不清这俩,后来问了公司的老程序员,他说“看场景选就行”:
search.php?keyword=PHP教程
,用户可以把链接发给朋友,直接看到搜索结果。 我把两者的区别做成了表格,你一看就懂:
对比项 | GET请求 | POST请求 |
---|---|---|
数据位置 | URL地址栏 | HTTP请求体 |
数据大小 | 一般≤2KB(浏览器限制) | 无明确限制(看服务器配置) |
安全性 | 低(数据暴露) | 较高(数据隐藏) |
适用场景 | 搜索、分页、分享链接 | 登录、注册、提交敏感信息 |
URL传值:我用“笨办法”,再也没丢过参数
再讲URL传值——比如你做文章列表页,点“查看详情”要带文章ID;或者做分页,点“下一页”要带当前页码,这些都要用URL传值。我之前做这些功能时,总犯低级错误,后来 了几个“笨办法”,再也没出过错。
笨办法1:记牢URL传值的“格式规范”
URL传值的格式就一句话:URL?参数名=值&参数名=值——比如:
detail.php?id=1
(单参数,id是文章ID); list.php?page=2&category=php
(多参数,page是当前页,category是分类)。 我之前做商品详情页时,把?写成了&,结果URL变成detail.php&id=1
,后台拿不到id,排查了半小时才发现——你写的时候,一定要先确认“?”的位置对不对。
笨办法2:后台取参数用$_GET,一定要“安全过滤”
后台拿URL参数用$_GET,比如detail.php里拿文章ID:
<?php // 拿文章ID,先用intval()转成整数(安全第一!)
$id = intval($_GET['id']);
// 验证id是不是有效(比如不能是0或负数)
if ($id <= 0) {
echo "无效的文章ID!";
exit;
}
// 用id查数据库
$sql = "SELECT * FROM articles WHERE id = $id";
// ...
?>
为什么要用intval()?我之前帮朋友的博客改代码时,他直接用$id = $_GET['id']
拼SQL,结果被人注入了——有人传?id=1 OR 1=1
,导致数据库里的所有文章都被查出来,甚至被删除。intval()能把id转成整数,就算有恶意参数,也会被“净化”成合法数字。
笨办法3:中文参数要“编码解码”,避免乱码
要是URL里有中文(比如搜索“PHP教程”),直接传会乱码——你得先用urlencode()
编码,后台用urldecode()
解码:
// 生成URL时编码(比如在搜索页)
$keyword = "PHP教程";
$encoded_keyword = urlencode($keyword);
$url = "search.php?keyword=$encoded_keyword"; // 结果是search.php?keyword=PHP%E6%95%99%E7%A8%8B
// 后台解码(search.php里)
$keyword = urldecode($_GET['keyword']); // 解码后是“PHP教程”
我之前做搜索功能时没编码,结果用户搜“PHP教程”,后台拿到的是乱码,根本搜不到东西——你看,这么小的细节,不注意就会出问题。
你要是按我讲的这些方法试了,不管成功还是遇到问题,都可以在评论区告诉我——我当初学的时候,也是摸爬滚打过来的,能帮你少走点弯路,我就开心啦!
我之前帮朋友改他的博客代码,真的踩过过滤数据的大坑——他做评论功能的时候,直接把用户输入的内容往数据库里插,结果有天早上打开博客,首页全是弹窗广告,点一下还跳钓鱼网站。我翻代码才发现,他根本没过滤评论内容,有人传了带标签的内容,浏览器把这标签当成代码执行了,这就是常说的“XSS攻击”。还有更险的一次,他的文章详情页用URL传id,直接拼进SQL里,有人传了个?id=1 OR 1=1,结果数据库里所有文章都被查出来,差点被删光——这叫“SQL注入”,就是坏人用恶意参数钻空子。你看,过滤数据真不是“多此一举”,就是防这些乱七八糟的破坏,不然辛辛苦苦做的网站,可能一下子就废了。
其实过滤没那么复杂,我平时就用两个“笨办法”,不用记复杂的函数。要是传的是数字参数(比如文章id、分页的页码),直接用intval()转成整数就行——比如$id = intval($_GET[‘id’]),不管你传过来的是1,还是1 OR 1=1,甚至是乱七八糟的字符,intval()都会把它变成纯数字,恶意内容直接被“砍”掉。要是字符串参数(比如用户名、评论、标题),就用htmlspecialchars()转一下——比如$username = htmlspecialchars($_POST[‘username’]),它会把、”这些容易搞事的特殊字符,变成安全的“实体字符”,比如<会变成<,这样就算有人传标签,浏览器也不会当成代码跑,只会显示成普通的文本。我朋友后来按这两步改了代码,再也没出过大问题——虽然每次写的时候多敲几行,但总比网站被黑、数据丢了强,对吧?
表单提交后后台拿不到数据,常见原因有哪些?
最常见的3个原因:① 输入框没加name
属性(后台靠name识别数据,没name等于“没给数据贴标签”,根本找不到);② form
标签漏写method
(默认是GET,要是后台用$_POST
取就会空);③ action
路径写错(比如把handle_login.php
写成handle_login.pnp
,数据发错了地方)。我之前漏加name属性,后台$_POST
是空的——你写完表单一定要检查这3点。
URL里带了参数,后台用$_GET拿不到怎么办?
先查3个简单问题:① URL格式对不对(是不是“?参数名=值”,比如?id=1
而不是&i=1
——?是第一个参数的开头,&是后续参数的分隔符);② 参数名有没有拼写错(比如后台写$_GET['id']
,URL里却写成?lid=1
);③ 中文参数有没有编码(直接传中文会乱码,要用urlencode()
把中文转成%开头的编码,后台用urldecode()
解回来)。我之前把?id=
写成&i=
,导致所有链接都打不开——拼写错是最容易忽略的低级错。
PHP传值时为什么要过滤数据?怎么简单过滤?
过滤是为了防“坏人搞破坏”:比如有人传?id=1 OR 1=1
,如果直接拼SQL,会把数据库里所有数据查出来(这叫SQL注入);或者传带标签的内容,会在页面弹出广告(这叫XSS攻击)。简单过滤方法:① 数字参数用intval()转整数(比如
$id = intval($_GET['id']),把非数字的字符去掉);② 字符串参数用
htmlspecialchars()转义(比如
$username = htmlspecialchars($_POST['username']),把这些特殊字符变成安全的实体字符)。我帮朋友改博客时,他没过滤,结果被注入了——过滤虽然麻烦,但能避免大问题。
什么时候用GET,什么时候用POST?有没有简单的判断方法?
用一句大白话区分:① 能“分享给别人看”的用GET(比如搜索“PHP教程”,URL是search.php?keyword=PHP教程
,可以发给朋友直接看结果);② 不能“公开”的用POST(比如登录密码,要是用GET会把密码暴露在URL里,别人一眼就看到)。再记个场景:登录、注册、提交评论用POST;搜索、分页、分享链接用GET——实在分不清,就想“这个URL能复制给朋友吗?能就用GET,不能就用POST”。