- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔法常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混淆
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc 和 Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期与时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 宇宙飞船运算符
- PHP 控制语句
- PHP - 决策
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - Final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET 和 POST
- PHP - 文件上传
- PHP - Cookie
- PHP - 会话
- PHP - 会话选项
- PHP - 发送邮件
- PHP - 净化输入
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 编码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 针对 C 开发人员
- PHP - 针对 PERL 开发人员
- PHP - 框架
- PHP - 核心 PHP 与框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望
- PHP - Use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已移除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP - Cookie
万维网由 HTTP 协议提供支持,HTTP 协议是一种无状态协议。Cookie 的机制帮助服务器维护先前请求的信息。PHP 透明地支持 HTTP Cookie。
当客户端第一次发送请求时,服务器会在其响应中包含一小段数据作为 Cookie。PHP 提供了 **setcookie()** 方法来在响应中注入 Cookie。
此 Cookie 数据作为文本文件存储在客户端的机器中。在相同客户端的后续访问中,这些 Cookie 将作为 **请求** 标头的部分内容包含在内。
服务器使用 PHP 超全局变量“$_COOKIE”填充客户端请求中存在的全部 Cookie。
本章将教你如何设置 Cookie、如何访问它们以及如何删除它们。
Cookie 的结构
Cookie 通常在 HTTP 标头中设置(尽管 JavaScript 也可以直接在浏览器上设置 Cookie)。设置 Cookie 的 PHP 脚本可能会发送如下所示的标头:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html
如您所见,Set-Cookie 标头包含一个名称值对、一个 GMT 日期、一个路径和一个域名。名称和值将进行 URL 编码。expires 字段是指示浏览器在给定的时间和日期后“忘记”Cookie 的指令。
如果浏览器配置为存储 Cookie,它将保留此信息,直到过期日期。如果用户将浏览器指向与 Cookie 的路径和域匹配的任何页面,它将把 Cookie 重新发送到服务器。浏览器的标头可能如下所示:
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: zink.demon.co.uk:1126 Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyz
然后,PHP 脚本将能够在环境变量 $_COOKIE 或 $HTTP_COOKIE_VARS[] 中访问 Cookie,该变量保存所有 Cookie 的名称和值。上面的 Cookie 可以使用 $HTTP_COOKIE_VARS["name"] 访问。
如何在 PHP 中设置 Cookie?
PHP 包含 **setcookie** 函数来创建 Cookie 对象,以便与 HTTP 响应一起发送到客户端。
setcookie(name, value, expire, path, domain, security);
参数
以下是所有参数的详细信息:
**名称** - 设置 Cookie 的名称,并存储在名为 HTTP_COOKIE_VARS 的环境变量中。此变量用于访问 Cookie。
**值** - 设置命名变量的值,它是您实际要存储的内容。
**过期时间** - 指定自 1970 年 1 月 1 日 00:00:00 GMT 以来以秒为单位的未来时间。在此时间之后,Cookie 将变得不可访问。如果未设置此参数,则 Cookie 将在 Web 浏览器关闭时自动过期。
**路径** - 指定 Cookie 有效的目录。单个正斜杠字符允许 Cookie 对所有目录有效。
**域** - 可用于在非常大的域中指定域名,并且必须包含至少两个句点才能有效。所有 Cookie 只对创建它们的宿主和域有效。
**安全** - 可以设置为 1 以指定 Cookie 应仅通过使用 HTTPS 的安全传输发送,否则设置为 0,这意味着 Cookie 可以通过常规 HTTP 发送。
示例
下面给出的 PHP 脚本检查名为 **username** 的 Cookie 是否已设置,如果已设置,则检索其值。否则,将设置一个新的 Cookie **username**。
<?php if (isset($_COOKIE['username'])) { echo "<h2>Cookie username already set:" . $_COOKIE['username'] . "</h2>"; } else { setcookie("username", "MohanKumar"); echo "<h2>Cookie username is now set</h2>"; } ?>
从 Apache 服务器的文档根目录运行此脚本。您应该看到以下消息:
Cookie username is now set
如果重新执行此脚本,则 Cookie 现在已设置。
Cookie username already set: MohanKumar
浏览器的开发者工具是一个非常有用的工具。您可以使用它来设置、检索和删除 Cookie。上述程序设置的 Cookie 可以在浏览器开发者工具的“应用程序”选项卡下查看。
如下所示的 **foreach** 循环检索所有 Cookie:
<?php $arr=$_COOKIE; foreach ($arr as $key=>$val); echo "<h2>$key=>$val </h2>"; ?>
以下脚本包含一个 HTML 表单。它将表单数据发送到 setcookie.php 脚本,该脚本使用从 **$_POST** 数组检索的数据设置 Cookie。
以下代码呈现 HTML 表单:
<form action="setcookie.php" method="POST"> <input type="text" name="name"> <input type="text" name="age"> <input type="submit" name="Submit"> </form>
**SetCookie.php** 读取表单数据并设置 Cookie。
if (isset($_POST["submit"]) { setcookie("name", $_POST["name"]); setcookie("age", $_POST["age"]); }
使用另一个 getcookie.php 代码,我们可以检索设置的 Cookie。
if (isset($_COOKIE["name"]) echo "Cookie: name => " . $_COOKIE["name"]. "<br>"; if (isset($_COOKIE["age"]) echo "Cookie: age => " . $_COOKIE["age"]. "<br>";
使用 PHP 访问 Cookie
PHP 提供了许多访问 Cookie 的方法。最简单的方法是使用 $_COOKIE 或 $HTTP_COOKIE_VARS 变量。以下示例将访问上述示例中设置的所有 Cookie。
<?php echo $_COOKIE["name"]. "<br />"; /* is equivalent to */ echo $HTTP_COOKIE_VARS["name"]. "<br />"; echo $_COOKIE["age"] . "<br />"; /* is equivalent to */ echo $HTTP_COOKIE_VARS["age"] . "<br />"; ?>
您可以使用 **isset()** 函数来检查 Cookie 是否已设置。
<?php if( isset($_COOKIE["name"])) echo "Welcome " . $_COOKIE["name"] . "<br />"; else echo "Sorry... Not recognized" . "<br />"; ?>
删除 Cookie
要删除 Cookie,请使用已过期的日期设置 Cookie,以便浏览器触发 Cookie 删除机制。
示例
请查看以下示例:
<?php setcookie("username", "", time() - 3600); echo "<h2>Cookie username is now removed</h2>"; ?>
浏览器显示以下响应:
Cookie username is now removed
您也可以通过在 Cookie 名称中使用数组表示法来设置数组 Cookie。
setcookie("user[three]", "Guest"); setcookie("user[two]", "user"); setcookie("user[one]", "admin");
如果 Cookie 名称包含点 (.),PHP 会将它们替换为下划线 (_)。
尽管 Cookie 概念背后的主要目的是帮助 Web 开发人员提供更个性化和便捷的用户体验,但它可能会对您的隐私和个人信息构成风险。
在某些情况下,应用程序可能会拒绝您完全访问权限,除非您接受其 Cookie。在这种情况下,建议定期清除浏览器缓存中与 Cookie 相关的数据。