跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP设置Cookie
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP设置Cookie = == 介绍 == '''Cookie'''是存储在用户浏览器中的小型文本数据,用于在多个页面请求间保持状态信息。PHP通过<code>setcookie()</code>函数实现Cookie的设置与管理,广泛应用于用户登录、个性化设置等场景。 Cookie的主要特性: * 存储在客户端浏览器 * 可设置过期时间(会话Cookie或持久Cookie) * 默认大小限制为4KB * 每次HTTP请求会自动发送到服务器 == 基本语法 == PHP设置Cookie的基本语法: <syntaxhighlight lang="php"> setcookie( string $name, string $value = "", int $expires = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false ): bool </syntaxhighlight> 参数说明: * '''$name''' - Cookie名称(必需) * '''$value''' - Cookie值(默认空字符串) * '''$expires''' - 过期时间戳(0表示会话Cookie) * '''$path''' - 服务器路径(默认当前目录) * '''$domain''' - 有效域名(默认当前域名) * '''$secure''' - 仅HTTPS传输(默认false) * '''$httponly''' - 禁止JavaScript访问(默认false) == 基础示例 == === 设置简单Cookie === <syntaxhighlight lang="php"> <?php // 设置有效期为1小时的Cookie setcookie("username", "john_doe", time() + 3600); // 读取Cookie(下次请求才可用) echo $_COOKIE['username'] ?? 'Cookie未设置'; ?> </syntaxhighlight> '''输出说明''': 首次访问时显示"Cookie未设置",刷新页面后显示"john_doe" === 设置带选项的Cookie === <syntaxhighlight lang="php"> <?php setcookie( "preferences", "dark_theme", time() + (30 * 24 * 3600), // 30天有效期 "/", // 全站可用 "example.com", // 主域名及子域名 true, // 仅HTTPS true // HTTP-only ); ?> </syntaxhighlight> == 高级用法 == === 数组形式Cookie === PHP支持通过[]语法设置数组Cookie: <syntaxhighlight lang="php"> <?php setcookie("user[username]", "alice"); setcookie("user[preferences][theme]", "dark"); setcookie("user[preferences][font]", "16px"); // 读取时会自动转换为数组 print_r($_COOKIE['user']); ?> </syntaxhighlight> '''输出结构''': <pre> Array ( [username] => alice [preferences] => Array ( [theme] => dark [font] => 16px ) ) </pre> === Cookie与Header冲突 === 注意:<code>setcookie()</code>是通过HTTP头实现的,必须在输出任何内容前调用: <syntaxhighlight lang="php"> <?php // 正确:在脚本开头设置 setcookie("test", "value"); // 错误:输出后设置会导致警告 echo "Hello"; setcookie("bad_timing", "value"); // 产生警告 ?> </syntaxhighlight> == 实际应用案例 == === 用户主题偏好 === 保存用户选择的界面主题: <syntaxhighlight lang="php"> <?php if (isset($_POST['theme'])) { $theme = htmlspecialchars($_POST['theme']); setcookie("site_theme", $theme, time() + (365 * 24 * 3600), "/"); header("Location: ".$_SERVER['PHP_SELF']); // 重载页面 exit; } // 应用主题 $currentTheme = $_COOKIE['site_theme'] ?? 'light'; ?> <html data-theme="<?= $currentTheme ?>"> <!-- 页面内容 --> </html> </syntaxhighlight> === 多语言选择 === 存储用户语言偏好: <syntaxhighlight lang="php"> <?php $availableLangs = ['en', 'es', 'fr']; if (isset($_GET['lang']) && in_array($_GET['lang'], $availableLangs)) { setcookie("user_lang", $_GET['lang'], time() + (30 * 24 * 3600), "/"); } $userLang = $_COOKIE['user_lang'] ?? 'en'; // 加载对应语言文件 include "lang/$userLang.php"; ?> </syntaxhighlight> == 安全注意事项 == <mermaid> graph TD A[设置Cookie] --> B[使用HTTPS] A --> C[设置HttpOnly] A --> D[设置Secure] A --> E[限制有效期] A --> F[敏感数据加密] </mermaid> 重要安全实践: 1. '''敏感数据不应存Cookie''':使用Session存储敏感信息 2. '''始终验证Cookie数据''':客户端数据不可信 3. '''考虑SameSite属性'''(PHP 7.3+): <syntaxhighlight lang="php"> setcookie("samesite_test", "1", [ 'expires' => time() + 3600, 'samesite' => 'Strict', 'secure' => true, 'httponly' => true ]); </syntaxhighlight> == 常见问题 == === Cookie未生效的可能原因 === * 在输出内容后设置Cookie * 路径/域名限制 * 浏览器禁用Cookie * 时间设置错误(过去时间会立即过期) === 删除Cookie的正确方式 === 设置过期时间为过去: <syntaxhighlight lang="php"> setcookie("to_delete", "", time() - 3600); </syntaxhighlight> == 数学计算示例 == 计算Cookie过期时间(30天后过期): <math> \text{过期时间} = \text{当前时间} + (30 \times 24 \times 3600) </math> PHP实现: <syntaxhighlight lang="php"> $expire = time() + 30 * 24 * 60 * 60; // 30天的秒数 </syntaxhighlight> == 总结 == PHP的Cookie机制为Web开发提供了重要的状态保持能力。正确使用Cookie需要注意: * 设置时机(在输出前) * 合理配置参数(路径、域名、安全选项) * 安全性考虑(HttpOnly、Secure等) * 数据大小限制 通过合理运用Cookie,可以实现用户偏好保存、简单身份识别等功能,但敏感操作应结合Session等更安全的机制。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP会话与cookie]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)