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 的核心方法

  1. 获取参数
    使用 $_GET['key'] 获取 URL 参数,建议结合默认值处理:
   $search = $_GET['q'] ?? '默认搜索'; // 如果 q 未设置,返回默认值
   echo "搜索关键字: $search";
  1. 检查参数存在
    使用 isset() 检查参数是否传递,避免未定义索引错误:
   if (isset($_GET['id'])) {
       $id = $_GET['id'];
       echo "ID: $id";
   } else {
       echo "未提供 ID";
   }
  1. 清理输入
    使用 filter_var()htmlspecialchars() 清理数据,防止 XSS 攻击:
   $name = filter_var($_GET['name'] ?? '', FILTER_SANITIZE_STRING);
   $name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
   echo "清理后的姓名: $name";
  1. 处理数组参数
    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 处理搜索查询的完整示例。

  1. 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>
  1. 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 或其他攻击。

安全性注意事项

  1. 防止 XSS
   $query = htmlspecialchars($_GET['q'] ?? '', ENT_QUOTES, 'UTF-8');
  1. 防止 SQL 注入(如涉及数据库):
   $stmt = $pdo->prepare("SELECT * FROM table WHERE column = :value");
   $stmt->execute(['value' => $_GET['q']]);
  1. 参数验证
    验证参数格式或范围:
   $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 的 requiredtype 属性:
  <input type="text" name="q" required>

参考资源

总结

$_GET 是 PHP 中处理 URL 查询字符串的强大工具,适合搜索、分页等场景。通过清理输入、验证数据和结合数据库操作,开发者可以构建安全、用户友好的应用。注意防范 XSS 和 SQL 注入,确保数据有效性和安全性,是使用 $_GET 的关键。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注