PHP $_GET 变量
PHP $_GET 变量中文讲解
什么是 $_GET 变量?
$_GET
是 PHP 中的一个超全局变量(Superglobal Variable),用于收集通过 HTTP GET 方法从 URL 查询字符串(Query String)传递的数据。GET 方法将数据附加在 URL 中,形式如 example.com?key1=value1&key2=value2
,适合传递非敏感、小量数据,如搜索查询或页面参数。
为什么使用 $_GET?
- 简单传递:通过 URL 传递数据,适合查询、过滤或分页等场景。
- 可见性:数据在 URL 中可见,便于调试或分享链接。
- 书签友好:用户可保存带参数的 URL,便于后续访问。
- 典型场景:搜索表单、API 请求、页面导航(如
page=2
)。
基本语法
$_GET
是一个关联数组,键是 URL 查询字符串中的参数名,值是对应的参数值。例如:
http://example.com/index.php?name=Alice&age=25
PHP 代码:
<?php
$name = $_GET['name'] ?? ''; // 获取 name 参数
$age = $_GET['age'] ?? ''; // 获取 age 参数
echo "姓名: $name, 年龄: $age"; // 输出:姓名: Alice, 年龄: 25
?>
使用 $_GET 的核心方法
- 获取参数
使用$_GET['key']
获取 URL 参数,建议结合默认值处理:
$search = $_GET['q'] ?? '默认搜索'; // 如果 q 未设置,返回默认值
echo "搜索关键字: $search";
- 检查参数存在
使用isset()
检查参数是否传递,避免未定义索引错误:
if (isset($_GET['id'])) {
$id = $_GET['id'];
echo "ID: $id";
} else {
echo "未提供 ID";
}
- 清理输入
使用filter_var()
或htmlspecialchars()
清理数据,防止 XSS 攻击:
$name = filter_var($_GET['name'] ?? '', FILTER_SANITIZE_STRING);
$name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
echo "清理后的姓名: $name";
- 处理数组参数
GET 参数可以是数组,使用name[]
形式:
<a href="index.php?colors[]=red&colors[]=blue">传递数组</a>
PHP 获取:
$colors = $_GET['colors'] ?? [];
foreach ($colors as $color) {
echo "颜色: $color<br>";
}
// 输出:
// 颜色: red
// 颜色: blue
完整示例:搜索表单
以下是一个使用 $_GET
处理搜索查询的完整示例。
- HTML 表单 (
search.html
):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>搜索</title>
</head>
<body>
<form action="search.php" method="get">
<label for="q">搜索关键字:</label>
<input type="text" id="q" name="q" value="<?php echo isset($_GET['q']) ? htmlspecialchars($_GET['q']) : ''; ?>">
<input type="submit" value="搜索">
</form>
</body>
</html>
- PHP 处理脚本 (
search.php
):
<?php
// 初始化错误数组
$errors = [];
$query = '';
// 检查请求方法和参数
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['q'])) {
// 获取并清理输入
$query = trim($_GET['q'] ?? '');
$query = filter_var($query, FILTER_SANITIZE_STRING);
$query = htmlspecialchars($query, ENT_QUOTES, 'UTF-8');
// 验证输入
if (empty($query)) {
$errors[] = "搜索关键字不能为空";
} elseif (strlen($query) < 3) {
$errors[] = "搜索关键字至少需要 3 个字符";
}
// 如果没有错误,处理搜索
if (empty($errors)) {
// 模拟搜索结果(可替换为数据库查询)
echo "搜索结果 for: $query";
// 示例:连接数据库搜索
/*
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM articles WHERE title LIKE :query");
$stmt->execute(['query' => "%$query%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $result) {
echo "<p>" . htmlspecialchars($result['title']) . "</p>";
}
} catch (PDOException $e) {
$errors[] = "数据库错误: " . $e->getMessage();
}
*/
}
}
// 显示错误并回显表单
if (!empty($errors)) {
echo "<div style='color: red;'><ul>";
foreach ($errors as $error) {
echo "<li>$error</li>";
}
echo "</ul></div>";
}
include 'search.html';
?>
关键点解析
- 表单方法:使用
method="get"
,数据通过 URL 传递(如search.php?q=test
)。 - 输入清理:使用
trim()
移除空格,filter_var(FILTER_SANITIZE_STRING)
清理非法字符,htmlspecialchars()
防止 XSS。 - 验证:检查关键字是否为空或太短(示例中要求至少 3 个字符)。
- 回显输入:在表单中回显用户输入,方便修改。
- 数据库交互:注释部分展示了如何结合 PDO 查询数据库,防止 SQL 注入。
$_GET 的特点与限制
- 可见性:数据在 URL 中可见,不适合敏感信息(如密码)。
- 长度限制:URL 长度通常限制在 2048 字符(视浏览器和服务器而定),不适合大数据。
- 缓存性:GET 请求可能被浏览器或代理缓存,适合静态查询。
- 安全性:需清理输入以防止 XSS 或其他攻击。
安全性注意事项
- 防止 XSS:
$query = htmlspecialchars($_GET['q'] ?? '', ENT_QUOTES, 'UTF-8');
- 防止 SQL 注入(如涉及数据库):
$stmt = $pdo->prepare("SELECT * FROM table WHERE column = :value");
$stmt->execute(['value' => $_GET['q']]);
- 参数验证:
验证参数格式或范围:
$page = filter_var($_GET['page'] ?? 1, FILTER_VALIDATE_INT);
if ($page === false || $page < 1) {
$page = 1; // 默认值
}
$_GET vs $_POST
- $_GET:适合公开、非敏感数据,数据通过 URL 传递,易于分享和调试。
- $_POST:适合敏感或大数据,数据通过请求体传递,URL 中不可见。
最佳实践
- 清理输入:始终使用
filter_var()
和htmlspecialchars()
处理$_GET
数据。 - 默认值:使用
??
或isset()
提供默认值,避免未定义索引错误。 - 验证逻辑:在处理前验证数据有效性(如长度、格式)。
- 错误提示:提供具体的错误信息,如“搜索关键字不能为空”。
- 客户端支持:结合 HTML5 的
required
和type
属性:
<input type="text" name="q" required>
参考资源
- PHP 官方手册 – $_GET:超全局变量说明。
- 菜鸟教程 – PHP GET 方法:初学者友好教程。
- OWASP 安全指南:Web 安全最佳实践。
总结
$_GET
是 PHP 中处理 URL 查询字符串的强大工具,适合搜索、分页等场景。通过清理输入、验证数据和结合数据库操作,开发者可以构建安全、用户友好的应用。注意防范 XSS 和 SQL 注入,确保数据有效性和安全性,是使用 $_GET
的关键。