各位自习室的小伙伴们,大家好!
在 PHP 后端开发中,超全局变量是我们每天都会接触的基础工具,尤其是 $_GET、$_POST、$_SESSION 这三个,分别对应着数据传递、表单提交、用户会话存储三大核心场景。但新手很容易在使用中踩坑——要么忽略安全风险,要么因使用不规范导致程序报错、逻辑混乱。
今天这篇「基础自习室」内容,就带大家夯实这三个超全局变量的使用地基,理清规范、避开常见陷阱,让代码更健壮、更安全。
一、基础认知:三大超全局变量是什么?
超全局变量是 PHP 预定义的、在脚本的所有作用域中都可访问的变量,无需声明 global 即可使用。我们先明确三个变量的核心用途和区别:
1. $_GET:URL 传参的“搬运工”
作用:用于收集通过 URL 地址传递的参数(如地址栏问号后的键值对),也可接收表单中 method="get" 提交的数据。
特点:参数会直接暴露在 URL 中,可被浏览器缓存、收藏,传递数据量有限(通常受限于浏览器对 URL 长度的限制,一般建议不超过 2KB)。
示例:访问 URL http://example.com/index.php?id=1&name=test,可通过以下代码获取参数:
<?php$id = $_GET['id']; // 取值 1$name = $_GET['name']; // 取值 test?>
2. $_POST:表单数据的“保密员”
作用:用于收集表单中 method="post" 提交的数据,也可接收 AJAX 异步提交的非 URL 暴露数据。
特点:参数不会显示在 URL 中,数据传递量更大(理论上无限制,受服务器配置影响),安全性比 $_GET 更高,适合提交敏感数据(如账号密码、表单内容)。
示例:处理登录表单提交的数据:
<?php$username = $_POST['username'];$password = $_POST['password'];// 后续验证逻辑?>
3. $_SESSION:用户会话的“储物柜”
作用:用于存储用户会话期间的状态数据(如登录状态、用户信息),数据存储在服务器端,客户端仅保存一个会话 ID(通过 Cookie 传递,默认键名为 PHPSESSID)。
特点:数据仅对当前用户会话有效,会话结束(关闭浏览器、手动销毁)后数据失效,适合跨页面保持用户状态。
核心前提:使用 $_SESSION 前,必须在脚本最顶部调用 session_start() 启动会话(无输出内容前调用,否则会报 headers already sent 错误)。
二、使用规范:各司其职,规范先行
规范使用不仅能避免报错,还能提升代码安全性和可维护性,以下是分变量的核心规范:
1. $_GET 使用规范
<?php// 安全取值方式$id = isset($_GET['id']) && is_numeric($_GET['id']) ? intval($_GET['id']) : 0;if ($id <= 0) { exit('非法参数:ID 必须为正整数');}?>
2. $_POST 使用规范
<?php// 过滤用户名(去除 HTML 标签、首尾空格)$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);// 验证邮箱格式$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);if (!$email) { exit('邮箱格式错误');}?>
<?php$json = file_get_contents('php://input');$data = json_decode($json, true); // 转为关联数组$username = $data['username'] ?? '';?>
3. $_SESSION 使用规范
启动时机正确:session_start() 必须放在脚本最顶部,且前面无任何输出(包括空格、HTML 标签),否则会触发“headers already sent”错误。
存储内容适度:仅存储必要的会话数据(如用户 ID、用户名、权限标识),禁止存储大量数据(如数据库查询结果、大文本),避免占用过多服务器内存。
及时销毁会话:用户退出登录时,需彻底销毁会话,而非仅清空部分数据。正确步骤:
<?phpsession_start();// 清空会话数据$_SESSION = [];// 销毁会话 Cookieif (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 3600, '/');}// 销毁服务器端会话文件session_destroy();// 跳转至登录页header('Location: login.php');exit;?>
三、避坑指南:避开这些新手高频错误
1. 坑点一:未检查参数存在性直接取值
错误写法:$id = $_GET['id'];(若 URL 中无 id 参数,会报 Undefined index 错误)。
解决方案:用 isset() 或 empty() 检查,或用三元运算符、null 合并运算符(PHP7+)取值:
$id = $_GET['id'] ?? 0; // PHP7+ 语法,等价于 isset($_GET['id']) ? $_GET['id'] : 0
2. 坑点二:信任用户输入,引发安全漏洞
错误写法:直接将 $_GET/$_POST 数据代入 SQL 语句、输出到页面,导致 SQL 注入、XSS 攻击。
解决方案: - SQL 操作:使用预处理语句(PDO、MySQLi),禁止字符串拼接; - 页面输出:用 htmlspecialchars() 转义特殊字符,示例:echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8');。
3. 坑点三:session_start() 调用时机错误
错误场景:在 echo、HTML 标签之后调用 session_start(),导致 headers 已发送错误。
解决方案:确保 session_start() 是脚本第一行代码,若需混合 HTML 和 PHP,可将 PHP 代码放在最顶部,或使用输出缓冲(ob_start())临时缓存输出。
4. 坑点四:混淆 $_GET 与 $_POST 的使用场景
错误场景:用 $_GET 提交登录密码(参数暴露在 URL 中,可被日志、代理记录);用 $_POST 传递分页参数(无法缓存页面,影响性能)。
解决方案:严格遵循“查询用 GET,提交用 POST”的原则。
5. 坑点五:会话数据无法跨页面共享
常见原因:部分页面未调用 session_start()、会话 ID 丢失、服务器会话存储目录无权限。
解决方案: - 所有需要使用会话的页面,顶部统一调用 session_start(); - 检查 php.ini 中 session.save_path 目录是否存在且有写入权限; - 确保客户端未禁用 Cookie(会话 ID 默认通过 Cookie 传递)。
四、总结
$_GET、$_POST、$_SESSION 是 PHP 后端开发的“基石工具”,使用时记住三个核心原则:参数必验证、数据必过滤、安全必重视。
新手阶段不用追求复杂用法,先把这些基础规范吃透,避开文中提到的坑点,就能写出更稳定、更安全的代码。后续在实际项目中,可结合框架(如 Laravel、ThinkPHP)的封装方法,进一步简化超全局变量的使用(框架会自动处理验证、过滤、会话安全等问题)。
你在使用 PHP 超全局变量时还踩过哪些坑?欢迎在评论区留言分享,一起在自习室里查漏补缺、共同进步!