如何在 PHP 中正确设置并读取包含数组数据的 Cookie

来源:AI教程网作者:清原小日向头衔:网络博主
导读:本期聚焦于小伙伴创作的《如何在 PHP 中正确设置并读取包含数组数据的 Cookie》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 PHP 中正确设置并读取包含数组数据的 Cookie》有用,将其分享出去将是对创作者最好的鼓励。

在PHP开发中,Cookie默认只能存储字符串类型的数据,如果直接尝试将数组赋值给Cookie,最终存储的内容会被强制转换为字符串,导致读取时无法还原为原始数组结构,因此需要对数组进行序列化处理后再存储。

如何在 PHP 中正确设置并读取包含数组数据的 Cookie

方案一:使用serialize序列化数组

serialize是PHP内置的序列化函数,可以将数组、对象等复杂数据类型转换为可存储的字符串,读取时再通过unserialize还原为原始数据。

设置包含数组的Cookie

首先使用serialize处理数组,再通过setcookie函数设置Cookie,注意需要对序列化后的字符串进行URL编码,避免特殊字符导致存储异常。

<?php
// 定义要存储的数组
$user_info = [
    'id' => 1001,
    'name' => '张三',
    'role' => 'admin'
];
// 序列化数组
$serialized_data = serialize($user_info);
// 设置Cookie,有效期1小时,路径为根目录
setcookie('user_info', urlencode($serialized_data), time() + 3600, '/');
?>

读取并还原数组

读取Cookie时先获取存储的字符串,进行URL解码后再使用unserialize还原数组,同时需要判断解码和还原过程是否成功,避免异常数据导致错误。

<?php
if (isset($_COOKIE['user_info'])) {
    // URL解码
    $encoded_data = urldecode($_COOKIE['user_info']);
    // 还原数组
    $user_info = unserialize($encoded_data);
    // 判断还原是否成功
    if ($user_info !== false) {
        echo '用户ID:' . $user_info['id'] . '<br>';
        echo '用户名称:' . $user_info['name'] . '<br>';
        echo '用户角色:' . $user_info['role'] . '<br>';
    } else {
        echo 'Cookie数据还原失败';
    }
} else {
    echo '未获取到用户Cookie';
}
?>

方案二:使用json_encode序列化数组

json_encode可以将数组转换为JSON格式的字符串,这种格式通用性更强,不仅PHP可以解析,其他语言也能正常处理,是更推荐的使用方式。

设置包含数组的Cookie

使用json_encode处理数组后,同样需要进行URL编码再存储到Cookie中。

<?php
// 定义要存储的数组
$cart_list = [
    ['goods_id' => 1, 'goods_name' => '手机', 'num' => 2],
    ['goods_id' => 3, 'goods_name' => '耳机', 'num' => 1]
];
// 转换为JSON字符串
$json_data = json_encode($cart_list, JSON_UNESCAPED_UNICODE);
// 设置Cookie
setcookie('cart_list', urlencode($json_data), time() + 3600, '/');
?>

读取并还原数组

读取时使用json_decode还原数组,第二个参数传入true可以返回数组格式,而不是默认的对象格式。

<?php
if (isset($_COOKIE['cart_list'])) {
    // URL解码
    $encoded_data = urldecode($_COOKIE['cart_list']);
    // 还原为数组
    $cart_list = json_decode($encoded_data, true);
    // 判断解析是否成功
    if (json_last_error() === JSON_ERROR_NONE) {
        foreach ($cart_list as $item) {
            echo '商品:' . $item['goods_name'] . ',数量:' . $item['num'] . '<br>';
        }
    } else {
        echo 'Cookie数据解析失败';
    }
} else {
    echo '未获取到购物车Cookie';
}
?>

两种方案的对比

以下是两种序列化方式的区别,开发者可以根据实际需求选择:

对比项serialize方案json_encode方案
通用性仅PHP可解析所有支持JSON的语言都可解析
数据类型保留可保留对象、资源等PHP特有类型仅支持JSON兼容的数据类型
字符串长度通常更长通常更短
安全性需注意unserialize的反序列化漏洞相对更安全

注意事项

  • Cookie有大小限制,通常单个Cookie不能超过4KB,因此存储的数组数据不能过大,否则会被截断导致无法还原。
  • 序列化后的字符串如果包含特殊字符,必须进行URL编码,否则设置Cookie时可能出现异常。
  • 如果存储的是敏感数据,不建议放在Cookie中,因为Cookie数据可以被客户端修改,如需存储建议加密后再存储。
  • 使用unserialize时,不要直接反序列化不可信的用户输入,避免触发PHP对象注入漏洞。
实际开发中更推荐使用json_encode方案处理数组Cookie,既保证了通用性,也降低了安全风险,同时注意对存储的数据大小做合理限制。

PHPCookie数组数据serializejson_encode修改时间:2026-07-08 21:27:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。