文章目录▼CloseOpen
- 先搞懂:表单传值到底怎么玩?
- URL传值:怎么把参数藏在链接里?
- 最后:用表格分清POST和GET的区别
- 为什么表单提交后,PHP拿不到输入的值?
- 表单传值用POST还是GET?怎么选?
- URL传值时,参数有中文或特殊字符怎么办?
- 接收数据时,PHP报“未定义索引”错误怎么办?
先搞懂:表单传值到底怎么玩?
我见过很多新手写表单,要么漏了关键属性,要么参数名写错,结果白忙活。其实表单传值就两步:写对HTML表单 + 用PHP接住数据。
先讲HTML表单的“正确姿势”——我之前写表单总忘加method,结果默认用GET,数据全暴露在URL里,后来才知道POST更安全。比如做用户注册,form标签要这么写:
这里有两个关键点:action是数据要发去的PHP文件(比如handle.php),method选POST(敏感数据,比如密码)或GET(比如搜索框)。我再强调一遍:method不要漏,不然默认用GET,数据会显示在URL里,超不安全。
再来说input标签的name属性——这是我踩过的最蠢的坑:第一次写input没加name,提交后$_POST里啥都没有,查了文档才明白:name是PHP识别字段的“身份证”。比如,PHP里就能用
$_POST['username']
拿到用户输入的内容。要是没加name,PHP根本不知道这是啥字段,自然拿不到值。
接下来是PHP接收数据的代码——我写了个简单的handle.php,加了注释,你一看就懂:
<?php // 解决中文乱码(记得HTML和PHP都要设utf-8)
header("Content-Type: text/html; charset=utf-8");
// 接收用户名(对应input的name="username")
$username = $_POST['username'];
// 接收密码(对应input的name="password")
$password = $_POST['password'];
// 简单验证(实际项目要连数据库,这里先模拟)
if ($username == 'admin' && $password == '123') {
echo '登录成功!';
} else {
echo '账号或密码错误,请重试。';
}
?>
是不是很简单?我当初写这段代码时,特意把每个步骤都标了注释——哪怕你是第一次碰PHP,也能跟着复制改一改就用。
再给你提个醒:中文乱码是新手常踩的坑。我之前做表单提交中文,结果显示一堆问号,后来在PHP文件开头加了header("Content-Type: text/html; charset=utf-8");
,同时把HTML的加上,就解决了。记住:HTML和PHP的编码要统一,都用utf-8准没错。
URL传值:怎么把参数藏在链接里?
说完表单,再讲URL传值——比如你做电商小demo,点商品标题要跳转到详情页,得把商品ID传过去。我当初学这个时,盯着链接看了半小时:“参数怎么加?PHP怎么拿?”后来才明白:URL传值就是把参数拼在链接后面。
比如商品列表里的链接,要传商品ID=1,就写成这样:
iPhone 15
这里的?id=1
就是参数——?
是参数的开始,id
是参数名,1
是参数值。要是有多个参数,用&
连接,比如detail.php?id=1&type=phone
。
接下来是PHP接收URL参数的代码——我写了个detail.php的示例,还是带注释:
<?php header("Content-Type: text/html; charset=utf-8");
// 接收URL里的id参数(对应链接里的?id=1)
$product_id = $_GET['id'];
// 模拟数据库数据(实际项目要查数据库,这里简化)
$products = array(
1 => array('name' => 'iPhone 15', 'price' => '5999', 'stock' => '有货'),
2 => array('name' => 'iPad Pro', 'price' => '7999', 'stock' => '缺货')
);
// 输出商品详情
echo '商品名称:' . $products[$product_id]['name'] . '
';
echo '价格:' . $products[$product_id]['price'] . '元
';
echo '库存:' . $products[$product_id]['stock'];
?>
你看,用$_GET['id']
就能拿到URL里的id值——是不是和表单传值差不多?只不过表单用$_POST
,URL用$_GET
。
再给你避个坑:URL传值别放敏感数据。我之前犯过傻——把用户密码拼在URL里,结果被朋友提醒:“这数据全暴露了,别人截个图就能盗号!”后来才知道,URL传值适合非敏感数据(比如商品ID、分页参数),敏感数据一定要用POST。
最后:用表格分清POST和GET的区别
我整理了个表格,帮你快速记住两者的不同——这是我当初学的时候贴在桌面的“作弊小抄”:
对比项 | POST | GET |
---|---|---|
数据位置 | 藏在请求体里(不暴露) | 显示在URL里(看得见) |
数据大小 | 无限制(取决于服务器) | 约2KB(浏览器限制) |
适用场景 | 敏感数据(登录、注册) | 非敏感数据(搜索、分页) |
安全性 | 较高(不暴露数据) | 较低(数据可见) |
比如做登录表单,优先用POST;做搜索框(比如“搜索商品”),用GET更方便——毕竟用户可能想保存搜索链接。
你要是按这些方法试了,比如写个简单的表单或者URL传值demo,欢迎回来告诉我效果!要是遇到问题,评论区留个言,我帮你看看——毕竟我也是从踩坑过来的~
比如你想做个商品分类的链接,要传“手机配件”这个词到URL里,直接写“category.php?type=手机配件”肯定不行——我之前就踩过这坑,点链接后页面显示一堆乱码,像“手机鍚堝惉”这种,根本看不懂。后来才明白,URL里不能直接放中文或者特殊字符(比如&、?、空格这些),浏览器解析的时候会“懵圈”,得先把这些字符转成“安全的字符串”才行。
那怎么转呢?用PHP的urlencode()函数就行。比如你要传“手机配件”,先在PHP里写$type = urlencode(“手机配件”);,这时候$type会变成“%E6%89%8B%E6%9C%BA%E9%85%8D%E4%BB%B6”——看起来像乱码,但其实是浏览器能看懂的“编码后的字符串”。然后把这个字符串拼到URL里,链接就变成“category.php?type=%E6%89%8B%E6%9C%BA%E9%85%8D%E4%BB%B6”,这样点链接就不会乱码了。
接收的时候也简单,用urldecode()函数把编码后的字符串转回来就行。比如PHP里写$type = urldecode($_GET[‘type’]);,这时候“%E6%89%8B%E6%9C%BA%E9%85%8D%E4%BB%B6”就变回“手机配件”了,正常显示没问题。
对了,还有空格这种特殊字符也得注意——比如你要传“小米 14”,直接写的话URL里会变成“xiaomi+14”,虽然很多浏览器能处理,但有的系统会把“+”当成空格,有的不会,容易出问题。用urlencode()的话,空格会转成“%20”,比如“小米 14”会变成“%E5%B0%8F%E7%B1%B3%2014”,这样不管什么系统都能正确解析,比用“+”靠谱多了。
现在很多浏览器会自动给URL里的中文编码,但为了兼容所有情况——比如老版本浏览器或者一些奇葩的系统——最好还是自己手动用urlencode()处理参数,尤其是用PHP生成链接的时候,亲测这样能少踩很多乱码的坑。
为什么表单提交后,PHP拿不到输入的值?
最常见的原因有三个:① input标签没加name属性(这是PHP识别字段的“身份证”,没加的话PHP根本不知道要拿什么);② form标签漏写method属性(默认用GET,若你用$_POST接收会空);③ action属性的PHP文件路径错误(比如把handle.php写成handle/php,要确认文件位置是否正确)。
表单传值用POST还是GET?怎么选?
优先看数据的敏感性:① 敏感数据(如密码、银行卡号)必须用POST,数据藏在请求体里,不会暴露在URL;② 非敏感数据(如搜索关键词、商品ID)可以用GET,方便用户保存或分享链接(比如“搜索iPhone 15”的结果页,用户能直接 bookmark)。
URL传值时,参数有中文或特殊字符怎么办?
需要对特殊字符“编码”。比如要传中文“手机”,可以用urlencode()函数把中文转成安全的字符串(比如%E6%89%8B%E6%9C%BA),再拼到URL里;PHP接收时用urldecode()转回来,就能正常显示中文了。
接收数据时,PHP报“未定义索引”错误怎么办?
这是因为你直接用$_POST[‘username’]但参数没传(比如用户没填就提交)。解决方法是先判断参数是否存在:比如if(isset($_POST[‘username’])) { $username = $_POST[‘username’]; } else { $username = ”; },先检查再赋值,就不会报错了。