会话与 Cookie

PHP 教程 · 第 12 章 · 7 次浏览

HTTP 是无状态协议,会话(Session)和 Cookie 用于在多次请求间维持用户状态(如登录态、购物车)。

Cookie

Cookie 存储在浏览器端,用 setcookie() 设置,$_COOKIE 读取。适合保存非敏感信息(偏好设置)。

Session

Session 数据存储在服务器端(默认文件),浏览器只保存 session_id(存在 Cookie 中)。使用前 session_start()

安全提示

  • 敏感数据(用户 ID、权限)放 Session 而非 Cookie;
  • Cookie 设置 HttpOnly 防止 JS 读取;
  • 退出登录时 session_destroy() 销毁会话。

代码示例

<?php
// 设置 Cookie(30 天有效,HttpOnly 防 JS 读取)
setcookie("theme", "dark", time() + 86400 * 30, "/", "", false, true);

// 启动 Session(必须在输出之前)
session_start();

// 登录成功后保存会话
$_SESSION["user_id"] = 1;
$_SESSION["username"] = "小王";
$_SESSION["is_admin"] = false;

// 读取会话
if (isset($_SESSION["username"])) {
    echo "当前用户:" . $_SESSION["username"];
}

// 退出登录
function logout() {
    $_SESSION = [];              // 清空会话数据
    if (ini_get("session.use_cookies")) {
        $p = session_get_cookie_params();
        setcookie(session_name(), "", time() - 42000,
            $p["path"], $p["domain"], $p["secure"], $p["httponly"]);
    }
    session_destroy();           // 销毁会话
}
?>
📚 PHP 语法速查
常用条目速查,完整版见对应教程章节。可复制代码到在线运行中测试。
写法 / 语法作用
&lt;?php ... ?&gt;PHP 代码块标记
echo "hello";输出字符串
$name = "张三";变量(以 $ 开头,无需声明类型)
if ($x > 0) { } else { }条件判断
foreach ($arr as $k => $v) { }遍历数组(最常用)
for ($i = 0; $i < 10; $i++) { }计数循环
function fn($a) { return $a; }定义函数
array("a" => 1)关联数组(PHP 的"字典")
count($arr)数组长度
isset($x) / empty($x)变量是否存在 / 是否为空
$_GET["key"] / $_POST["key"]获取表单 / 查询参数
$_SESSION["user"]会话数据读写(需 session_start())
$_COOKIE["key"]读取 Cookie
header("Location: /index.php");页面跳转
mysqli_connect($host, $user, $pass, $db)连接 MySQL(旧接口,新项目用 PDO)
new PDO($dsn, $user, $pass)连接 MySQL(推荐,防 SQL 注入)
$stmt->prepare($sql)预处理语句(防 SQL 注入)
htmlspecialchars($str)HTML 转义(防 XSS)
strlen($s) / mb_strlen($s)字符串长度
explode(",", $s) / implode(",", $arr)字符串拆分 / 拼接
json_encode($arr) / json_decode($s)数组与 JSON 互转
include / require引入文件(require 报错即停)
date("Y-m-d H:i:s")当前时间格式化
$_FILES["file"]文件上传数据
file_put_contents($path, $data)写入文件