萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 核心基礎 (三):日期時間、表單處理、Session 與 Cookie 完整實戰指南

Session:伺服器端狀態管理

<?php
// 必須在任何輸出前呼叫
session_start();

// 寫入
$_SESSION['user_id'] = 12345;
$_SESSION['username'] = 'admin';
$_SESSION['permissions'] = ['read', 'write', 'admin'];

// 讀取
echo "歡迎, {$_SESSION['username']}";

// 修改
$_SESSION['last_visit'] = time();

// 刪除單項
unset($_SESSION['permissions']);

// 銷毀整個 Session (登出)
session_unset();     // 清空 $_SESSION
session_destroy();   // 刪除伺服器端儲存與 Cookie
?>

跨頁面傳遞範例

page1.php

<?php
session_start();
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
echo '去下一頁';
?>

page2.php

<?php
session_start();
echo "最愛顏色: {$_SESSION['favcolor']}
"; echo "動物: {$_SESSION['animal']}
"; var_dump($_SESSION); ?>

表單資料接收:$_GET、$_POST、$_REQUEST

GET 方法

  • 資料附於 URL:page.php?name=Peter&age=37
  • 長度限制 (~2000 字元)、可見、可書籤、可分享
  • 適用:搜尋、分頁、篩選、非敏感資料
<form action="welcome.php" method="get">
  姓名: <input name="name"> 年齡: <input name="age">
  <button type="submit">送出</button>
</form>

<?php // welcome.php
echo "歡迎, {$_GET['name']}。你 {$_GET['age']} 歲。";
?>

POST 方法

  • 資料在 HTTP Body、URL 不顯示、無長度限制 (受 post_max_size 限制)
  • 適用:登入、註冊、上傳、修改/刪除操作
<form action="login.php" method="post">
  帳號: <input name="username">
  密碼: <input type="password" name="pwd">
  <button>登入</button>
</form>

<?php // login.php
$user = $_POST['username'] ?? '';
$pass = $_POST['pwd'] ?? '';
// 驗證邏輯...
?>

$_REQUEST 合併來源

包含 $_GET、$_POST、$_COOKIE (順序由 request_order / variables_order 決定)。建議明確使用 $_GET/$_POST,避免來源混淆導致安全漏洞。

URL 編碼/解碼

<?php
$raw = "第一頁";
$encoded = urlencode($raw);   // %E7%AC%AC%E4%B8%80%E9%A0%81
$decoded = urldecode($encoded); // 還原
echo "$raw";
// PHP 自動解碼 $_GET['page'] → "第一頁"
?>

Cookie:客戶端持久化儲存

<?php
// 設定 Cookie (必須在輸出前)
setcookie('user_id', '12345', time() + 3600, '/', '', false, true); // 1小時、全站、HttpOnly
setcookie('remember_me', '1', time() + 86400 * 30, '/'); // 30天

// 讀取
if (isset($_COOKIE['user_id'])) {
    echo "歡迎回來, User #{$_COOKIE['user_id']}";
}

// 刪除 (設定過去時間)
setcookie('user_id', '', time() - 3600, '/');
?>

Cookie 參數詳解

參數說明
nameCookie 名稱
value值 (自動 urlencode)
expireUnix 時間戳,0/省略 = 瀏覽器關閉失效 (Session Cookie)
path生效路徑,/ 為全站
domain生效網域,.example.com 含子網域
secure僅 HTTPS 傳輸
httponlyJS 無法存取 (document.cookie),防 XSS 竊取

日期時間處理

<?php
// 時區設定 (放在腳本最前端)
date_default_timezone_set('Asia/Taipei');

// 1. 當前時間戳
$now = time(); // 1703481600

// 2. 格式化輸出
echo date('Y-m-d H:i:s', $now); // 2024-12-25 14:30:00

// 3. 字串解析為時間戳
$str = '2024-12-25 10:26:10';
$ts = strtotime($str);

// 4. 相對時間
echo date('Y-m-d', strtotime('+3 days')); // 3 天后
echo date('Y-m-d', strtotime('next Monday'));

// 5. 高精度計時
$start = microtime(true);
// ... code ...
$elapsed = microtime(true) - $start;
printf("耗時: %.4f 秒", $elapsed);
?>

安全最佳實務總結

  1. CSRF 保護: 表單隱藏 csrf_token,Session 驗證。
  2. XSS 防護: 輸出時 htmlspecialchars($val, ENT_QUOTES, 'UTF-8')。
  3. Session 安全: session.cookie_httponly=1、session.cookie_secure=1 (HTTPS)、session.use_strict_mode=1。
  4. 輸入驗證: 白名單驗證、長度限制、型別轉換。
  5. 敏感資料不進 Cookie: Token、權限、個資僅存 Server Session/資料庫。
copyright © 萬盛學電腦網 all rights reserved