首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 超全域變數完整手冊:$_SERVER、$_GET、$_POST、$_SESSION 等九大核心變數詳解

     編輯:PHP 相關知識

PHP 九大超全域變數概覽

PHP 提供九個超全域變數,它們在所有作用域自動可用,無需 global 宣告。掌握它們的用途與差異,是處理 HTTP 請求、表單資料、會話管理的基石。

變數用途資料來源
$GLOBALS所有全域變數的引用陣列腳本全域範圍
$_SERVER伺服器與執行環境資訊Web Server / CGI 環境
$_GETURL 查詢字串參數GET 請求
$_POST表單提交資料 (application/x-www-form-urlencoded / multipart/form-data)POST 請求
$_COOKIEHTTP Cookie 資料Client 瀏覽器
$_FILES檔案上傳資訊POST 檔案上傳
$_ENV環境變數伺服器環境
$_REQUEST$_GET + $_POST + $_COOKIE 合併混合來源 (順序受 php.ini 控制)
$_SESSION會話資料伺服器端 Session 存儲

$_SERVER 變數深度解析

$_SERVER 是最豐富的超全域陣列,包含 HTTP 標頭、路徑、腳本位置等關鍵資訊。

常用鍵值對照表

鍵名說明範例值
PHP_SELF當前執行腳本路徑 (相對 Document Root)/index.php
QUERY_STRING查詢字串 (? 之後內容)id=123&name=test
REQUEST_METHOD請求方法GET, POST, PUT, DELETE
REQUEST_URI完整請求 URI/product?id=123
HTTP_HOSTHost 標頭example.com
HTTP_REFERER來源頁面 URL (不可靠,可偽造)https://google.com/search?q=php
HTTP_USER_AGENTUser-Agent 標頭Mozilla/5.0...
REMOTE_ADDR客戶端 IP192.168.1.100
SERVER_NAME伺服器主機名example.com
SERVER_PORT伺服器埠號80, 443
SCRIPT_FILENAME腳本絕對路徑/var/www/html/index.php
DOCUMENT_ROOT文件根目錄/var/www/html
HTTPS是否 HTTPSon / off
REQUEST_TIME請求開始時間戳 (Unix)1700000000
REQUEST_TIME_FLOAT微秒精度時間戳1700000000.1234

實戰應用範例

<?php
// 取得客戶端真實 IP (考慮代理)
function getClientIP() {
    $keys = ['HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
    foreach ($keys as $key) {
        if (!empty($_SERVER[$key])) {
            $ips = explode(',', $_SERVER[$key]);
            return trim($ips[0]);
        }
    }
    return 'unknown';
}

// 判斷是否 AJAX 請求
function isAjax() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) 
        && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

// 建立完整 URL
function getCurrentURL() {
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    return $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
?>

表單處理三劍客:$_GET、$_POST、$_REQUEST

$_GET - URL 參數傳遞

  • 資料可見於 URL,可加書籤、分享
  • 長度限制 (瀏覽器/伺服器約 2000-8000 字元)
  • 適用:搜尋、分頁、篩選、非敏感資料
  • 安全性:不適合傳遞密碼、Token、個資

$_POST - 請求主體傳遞

  • 資料在 HTTP Body,URL 不顯示
  • 無實質長度限制 (受 post_max_size、memory_limit 影響)
  • 適用:表單提交、檔案上傳、敏感資料、狀態變更操作
  • 需設定 enctype="multipart/form-data" 才能上傳檔案

$_REQUEST - 混合來源 (慎用)

<?php
// 預設順序:GPC (GET → POST → COOKIE)
// 可在 php.ini 設定 variables_order = "GPC"
// 風險:同名鍵值會互相覆蓋,來源不可控
$id = $_REQUEST['id'] ?? null; // 不知道 id 來自 GET/POST/COOKIE 哪裡
?>

建議:明確使用 $_GET 或 $_POST,避免 $_REQUEST 帶來的安全與除錯困擾。

$_FILES - 檔案上傳處理

<?php
// HTML 表單需設定 enctype="multipart/form-data"
/*
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="avatar">
    <button type="submit">上傳</button>
</form>
*/

// $_FILES 結構
// $_FILES['avatar'] = [
//     'name'     => 'photo.jpg',      // 原始檔名
//     'type'     => 'image/jpeg',     // MIME 類型 (客戶端提供,不可信)
//     'tmp_name' => '/tmp/phpA1B2C3', // 暫存路徑
//     'error'    => 0,                // 錯誤代碼 (0=成功)
//     'size'     => 102400,           // 檔案大小 (bytes)
// ];

// 基本驗證與移動
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['avatar']['tmp_name']);
    
    if (in_array($mime, $allowedTypes, true)) {
        $dest = '/var/www/uploads/' . bin2hex(random_bytes(8)) . '.jpg';
        move_uploaded_file($_FILES['avatar']['tmp_name'], $dest);
        echo "上傳成功:$dest";
    } else {
        echo "檔案類型不允許";
    }
}
?>

$_COOKIE 與 $_SESSION - 狀態管理雙雄

特性Cookie ($_COOKIE)Session ($_SESSION)
儲存位置客戶端瀏覽器伺服器端 (檔案/Redis/DB)
容量限制約 4KB / 個受伺服器儲存空間限制
生命週期可設定過期時間瀏覽器關閉或 gc_maxlifetime 過期
安全性可被竄改、攔截 (需 HttpOnly、Secure、SameSite)較安全,僅 Session ID 在客戶端
適用場景記住登入、偏好設定、追蹤用戶身份、購物車、敏感狀態

Session 安全最佳實踐

<?php
// 啟動 Session (必須在輸出前)
session_start();

// 防止 Session Fixation
if (!isset($_SESSION['initiated'])) {
    session_regenerate_id(true);
    $_SESSION['initiated'] = true;
}

// 設定 Cookie 參數 (PHP 7.3+)
session_set_cookie_params([
    'lifetime' => 3600,
    'path' => '/',
    'domain' => '.example.com',
    'secure' => true,      // 僅 HTTPS
    'httponly' => true,    // 防 XSS
    'samesite' => 'Lax',   // 防 CSRF
]);

// 存取資料
$_SESSION['user_id'] = 12345;
$_SESSION['permissions'] = ['read', 'write'];
?>

$GLOBALS - 全域變數的替代入口

<?php
$globalVar = "I'm global";

function test() {
    // 方式 1:global 關鍵字
    global $globalVar;
    echo $globalVar;
    
    // 方式 2:$GLOBALS 陣列 (不需 global 宣告)
    echo $GLOBALS['globalVar'];
    
    // 方式 3:修改全域變數
    $GLOBALS['globalVar'] = 'Modified';
}
?>

魔術常數補充

常數說明
__FILE__當前檔案完整路徑
__DIR__當前檔案目錄 (PHP 5.3+)
__LINE__當前行號
__FUNCTION__當前函式名稱
__CLASS__當前類別名稱
__METHOD__當前方法名稱
__NAMESPACE__當前命名空間
PHP_VERSIONPHP 版本字串
PHP_OS作業系統類型

安全檢查清單

  • ✅ 所有輸入視為不受信,使用 filter_input() 或手動驗證
  • ✅ 表單提交驗證 CSRF Token
  • ✅ 檔案上傳驗證 MIME 類型 (用 finfo 而非 $_FILES['type'])
  • ✅ Session ID 定期重生、設定 Secure/HttpOnly/SameSite
  • ✅ 不直接信任 $_SERVER['HTTP_REFERER']、$_SERVER['HTTP_X_FORWARDED_FOR']
  • ✅ 生產環境關閉 display_errors、開啟 log_errors

總結

九大超全域變數是 PHP 處理 HTTP 互動的核心 API。$_GET/$_POST 分工明確,$_SESSION 管理狀態,$_SERVER 提供環境感知,$_FILES 處理上傳。理解它們的資料來源、生命週期與安全邊界,能寫出更健壯、安全的 PHP 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved