頁面間傳值是 Web 開發基礎,最常見方式即 URL 參數(Query String)。本文詳解如何構建帶參數的超連結,以及在 PHP 中安全、正確地獲取這些值。
<a href="a.php?id=<?php echo $arr['id']; ?>">查看詳情</a>
<a href="b.php?id=<?php echo urlencode($id); ?>&username=<?php echo urlencode($username); ?>">
進入主頁
</a>
關鍵點: 使用 urlencode() 編碼參數值,防止空格、中文、特殊符號導致 URL 解析錯誤。
<?php
// 獲取 id 參數
$id = $_GET['id'] ?? null; // PHP 7+ 空合併運算符,避免 Undefined array key 警告
// 獲取 username
$username = $_GET['username'] ?? '';
?>
$id = $_REQUEST['id'] ?? null; // 同時包含 GET、POST、COOKIE,來源不明確,安全性較低
最佳實踐: 明確知道數據來源時,優先使用 $_GET 或 $_POST,語義清晰且安全。
<?php
$users = [
['id' => 1, 'name' => '張三'],
['id' => 2, 'name' => '李四'],
];
?>
<ul>
<?php foreach ($users as $user): ?>
<li>
<a href="b.php?id=<?= urlencode($user['id']) ?>&name=<?= urlencode($user['name']) ?>">
<?= htmlspecialchars($user['name']) ?>
</a>
</li>
<?php endforeach; ?>
</ul>
<?php
// 1. 獲取並過濾
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
if ($id === false || $id === null) {
die('非法的 ID 參數');
}
// 2. 業務邏輯(如查詢資料庫)
// $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
// $stmt->execute([$id]);
// $user = $stmt->fetch();
?>
<h1>用戶詳情</h1>
<p>ID: <?= $id ?></p>
<p>姓名: <?= $name ?></p>
htmlspecialchars() 防 XSS。filter_input() 或 filter_var()。| 現象 | 原因 | 解決 |
|---|---|---|
| Notice: Undefined array key | 參數未傳遞或拼寫錯誤 | 用 ?? 或 isset() 判斷 |
| 中文參數亂碼 | 未 urlencode / 頁面編碼不一致 | 統一 UTF-8 + urlencode |
| 取不到值 | 用了 $_POST 但實際是 GET | 檢查 $_SERVER['REQUEST_METHOD'] |