🤖 AI智能摘要

暂未配置

前言

HTTP 协议是无状态协议,服务器不会记住每一个浏览器用户是谁。浏览器访问网页,访问结束之后服务器立刻忘记用户信息。

如果想要记住用户登录状态、保存浏览记录、记住网站设置,就需要用到 Cookie 和 Session。
Cookie 把数据保存在浏览器客户端;Session 把数据保存在服务器端。登录状态几乎全部依靠 Session 来实现。本章学习 Cookie、Session 原理,完成完整登录‑退出登录实战。

一、Cookie 详解

Cookie 是服务器发给浏览器的一小段数据,浏览器会把它保存到本地硬盘。下次浏览器访问同一个网站时,会自动把 Cookie 携带发送给服务器。

1. 设置 Cookie setcookie ()

⚠️注意:setcookie () 必须写在页面任何输出之前,echo、HTML 代码都不能出现在 setcookie 前面,否则直接报错。
<?php
// setcookie(键名,值,过期时间)
// time()+3600 代表1小时之后过期
setcookie("username","admin",time()+3600);
setcookie("nick","管理员",time()+3600*24);
echo "Cookie设置成功";
?>

2. 读取 Cookie $\_COOKIE

<?php
if(isset($_COOKIE['username'])){
    echo "保存的用户名:".$_COOKIE['username'];
}else{
    echo "Cookie不存在";
}
?>

3. 删除 Cookie

把过期时间设置为过去的时间,浏览器就会自动销毁 Cookie。

<?php
setcookie("username","",time()-1);
echo "Cookie已经删除";
?>

4.Cookie 特点

  1. 存储在浏览器本地,用户可以查看、修改、删除;
  2. 不安全,不要存放密码、敏感数据
  3. 大小有限制,单个 Cookie 最多 4KB;
  4. 可以设置有效期,可以长期保存;
  5. 每次请求网页,浏览器自动携带 Cookie 发送给服务器。

二、Session 会话技术(登录核心)

Session 数据存储在服务器,浏览器只保存一个 Session‑ID。浏览器访问的时候携带 ID,服务器根据 ID 读取对应的数据。

  • 优点:数据存在服务器,安全,适合保存登录信息
  • 缺点:浏览器关闭之后默认失效(可以通过 Cookie 延长有效期)
⚠️重要:session_start()必须放在页面最顶部,页面输出之前调用,否则报错!

1. 开启 session

<?php
session_start();

//存入session
$_SESSION['username'] = "admin";
$_SESSION['nickname'] = "网站管理员";
$_SESSION['isLogin'] = true;

echo "Session写入完成";
?>

2. 读取 Session 数据

<?php
session_start();

//判断是否已经登录
if(isset($_SESSION['isLogin']) && $_SESSION['isLogin'] === true){
    echo "欢迎,".$_SESSION['nickname'];
}else{
    echo "您尚未登录";
}
?>

3. 清空单个 Session

<?php
session_start();
unset($_SESSION['nickname']);
?>

4. 全部清空 Session、销毁会话(退出登录)

<?php
session_start();

//清空内存当中session数组
$_SESSION = [];

//销毁服务器session文件
session_destroy();

echo "已经退出登录";
?>

5.Session 有效期延长

默认关闭浏览器 Session 就消失。如果想要记住登录 7 天,需要配合 Cookie 保存 session\_id。

<?php
//设置session cookie有效期7天
session_set_cookie_params(7*24*3600);
session_start();
?>

三、实战:完整登录系统(Session 版)

数据表继续使用上一章 user 表。一共 4 个页面:

  • login.html 登录表单
  • login.php 登录处理
  • index.php 会员中心(需要登录才能访问)
  • logout.php 退出登录

1. 登录表单 login.html

<form action="login.php" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>

2. 登录处理 login.php

<?php
session_start();

$username = trim($_POST["username"]);
$password = trim($_POST["password"]);

if(empty($username) || empty($password)){
    echo "账号密码不能为空 <a href='login.html'>返回</a>";
    exit;
}

//连接数据库,使用预处理查询,防止SQL注入
$conn = mysqli_connect("127.0.0.1","root","root","php_demo");
mysqli_set_charset($conn,"utf8mb4");

$sql = "SELECT nickname FROM user WHERE username=? AND password=?";
$stmt = mysqli_prepare($conn,$sql);
mysqli_stmt_bind_param($stmt,"ss",$username,$password);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$nickname);
mysqli_stmt_fetch($stmt);

if(!empty($nickname)){
    //登录成功,写入session
    $_SESSION['isLogin'] = true;
    $_SESSION['username'] = $username;
    $_SESSION['nickname'] = $nickname;

    echo "登录成功!<a href='index.php'>进入会员中心</a>";
}else{
    echo "账号密码错误!<a href='login.html'>返回</a>";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

3. 会员中心 index.php(登录检测页面)

<?php
session_start();

//没有登录直接跳转到登录页
if(!isset($_SESSION['isLogin']) || $_SESSION['isLogin'] !== true){
    header("Location:login.html");
    exit;
}
?>

<h2>会员中心</h2>
<p>你好:<?php echo $_SESSION['nickname']; ?></p>
<p>账号:<?php echo $_SESSION['username']; ?></p>
<a href="logout.php">点击退出登录</a>

4. 退出登录 logout.php

<?php
session_start();

//清空session
$_SESSION = [];
session_destroy();

//跳转到登录页面
header("Location:login.html");
exit;
?>

四、header 页面跳转

header("Location:地址");用于 PHP 服务端跳转。
⚠️header 前面不能有任何输出(echo、空格、HTML 都不行),写完 header 之后必须加上exit;终止后续代码执行。

<?php
header("Location:index.php");
exit;
?>

五、Cookie 与 Session 对比总结

项目CookieSession
存储位置浏览器客户端服务器端
安全性低,用户可修改高,用户无法直接修改
敏感数据❌禁止存放✅适合存放登录信息
有效期可以自由设置时间默认浏览器关闭失效,可配合 Cookie 延长
容量最大 4KB服务器几乎无限制

六、本章总结

  1. HTTP 是无状态协议,服务器不会记住用户,需要 Cookie、Session 保存状态;
  2. Cookie 存浏览器,setcookie () 设置,$\_COOKIE 读取;不能存密码等敏感信息;
  3. Session 存服务器,页面第一行必须 session\_start ();$\_SESSION 读写数据;
  4. session\_destroy () 用来实现退出登录,彻底销毁会话;
  5. header () 做页面跳转,跳转后一定要 exit 终止代码;
  6. 网站登录系统标准流程:表单提交→数据库校验→登录成功写入 Session→页面判断 Session 是否存在。
(注:部分内容可能由 AI 生成)