理解 $_GET 與 $_POST 的本質差異,是 Web 開發安全與架構設計的基礎。
| 特性 | GET | POST |
|---|---|---|
| 語意 | 從伺服器獲取資源 | 向伺服器提交/修改資料 |
| 資料位置 | URL 查詢字串 ?key=val&k2=v2 | HTTP Request Body |
| 可見性 | 瀏覽器網址列完整顯示 | 對用戶不可見(需開發工具查看) |
| 長度限制 | 受 URL 長度限制(約 2KB~8KB) | 理論無上限(受 post_max_size 設定) |
| 字符集 | 僅 ASCII,需 URL 編碼 | 支援完整 ISO-10646 (UTF-8 等) |
| 快取/書籤 | 可被快取、收藏、分享 | 不可快取、不可收藏 |
| 重複提交 | 重新整理無副作用 | 重新整理會重複提交(需 PRG 模式防護) |
| 安全性 | 低(日誌、歷史記錄、Referer 洩露) | 較高(不在 URL 中) |
/products?category=shoes&page=2/article/123<?php
// GET 範例:搜尋頁
$keyword = $_GET['q'] ?? '';
$page = (int)($_GET['page'] ?? 1);
// SQL: SELECT * FROM posts WHERE title LIKE ? LIMIT ?, 10
// POST 範例:發布文章
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = trim($_POST['title'] ?? '');
$content = trim($_POST['content'] ?? '');
// 驗證 → 入庫 → header('Location: /post/'.$id) // PRG 模式
}
// $_REQUEST = $_GET + $_POST + $_COOKIE(不建議使用,來源不明確)
?>
php://input 讀取enctype="multipart/form-data":檔案上傳專用,僅限 POST