set_cookie() 是 CodeIgniter Cookie Helper 的全局函数,需先加载 helper;$this->input->set_cookie() 是 Input 类方法,参数顺序固定且更面向对象,两者底层逻辑相同但调用方式和参数结构不同。
set_cookie() 是什么,和 $this->input->set_cookie() 有啥区别
是 CodeIgniter 的 Cookie Helper 提供的全局函数,必须先
才能用;而
是 Input 类的方法,底层其实也调用了同一个逻辑,但更“面向对象”一点。两者参数结构不同:前者接受数组或独立参数,后者强制按
顺序传参。
常见错误现象:混用两种写法却没加载对应依赖——比如直接调
却忘了
,结果静默失败,浏览器里根本看不到 cookie。
推荐统一用
数组形式,语义清晰、不易错位
如果已在构造函数自动加载 helper,就别重复
在较老版本 CI(如 2.x)中更常见,CI 3+ 更倾向 helper 函数
set_cookie() 数组参数怎么填才不踩坑
最稳妥的方式是传关联数组,把所有关键字段显式写出,尤其注意
是「秒数」而非时间戳,
和
留空时默认为当前域名和
,但一旦指定就必须带前导斜杠(
合法,
或
会失效)。
容易踩的坑:
设成
表示 1 小时后过期,不是“1 小时后的时间戳”;设成
表示会话级 cookie(关浏览器即丢),设负数则等同于删除。
和
必填,其他可选
时,cookie 只通过 HTTPS 传输;本地开发用 HTTP 却设了它,cookie 就不会写入
能防 XSS 读取,但 JS 就拿不到——若你前端要读这个 cookie,就得设
,且确认 config 中没全局锁死
为什么 set_cookie() 写了却看不到,或者 get_cookie() 返回 NULL
不是代码没跑,而是 cookie 没发到浏览器,或发了但被拦截/忽略。典型原因有三:响应头已发送(比如前面 echo 过、开启了输出缓冲但没 flush)、域名不匹配(
设太宽或太窄)、路径不一致(写在
路径下,却在
下读)。
调试建议:用浏览器开发者工具的 Application → Cookies 面板,看 domain/path/expiry 是否符合预期;再检查 Network → Response Headers 里有没有
字段。
确保 controller 方法里没有提前
、
或开启
后未清理
CI 默认对 cookie 值做 XSS 过滤,如果值含特殊字符(如 JSON 字符串),可能被清空——可传
给
,但务必自己做校验
返回的是过滤后的值;想绕过过滤直接读原始值,得用
(仅限模型或非安全敏感场景)
delete_cookie() 怎么删才真正生效
不是“清空值”,而是发一个 Max-Age=0 的
头,让浏览器立刻丢弃。所以它必须和当初设置时的
、
、
完全一致,否则删的是另一个 cookie。
常见错误:当初用
设置,删时却只写
,结果删不掉——因为 domain 不匹配。
删之前最好先
确认它还存在
安全起见,删的时候显式带上相同
和
:
如果用
设了
(如
),删时 name 必须带前缀,或同样传
参数
实际项目里最麻烦的往往不是写 cookie,而是 domain/path/prefix 三者组合错了一处,导致写进去、读不到、删不掉,来回折腾半小时。动手前花三十秒核对这三项,比查文档快得多。
set_cookie()$this->load->helper('cookie')$this->input->set_cookie()name, value, expire, domain, path, prefix, secure, httponlyset_cookie()load->helper('cookie')set_cookie()load->helper$this->input->set_cookie()expiredomainpath/path => '/'path => ''path => '\/'expire36000namevaluesecure => truehttponly => truefalsecookie_httponly = TRUEdomain/admin//api/Set-Cookie:echoprint_routput_bufferingxss_clean => FALSEget_cookie()get_cookie('xxx')$_COOKIE['xxx']delete_cookie()Set-Cookiedomainpathprefixset_cookie(['name'=>'token', 'domain'=>'.example.com'])delete_cookie('token')var_dump(get_cookie('token'))domainpathdelete_cookie(['name'=>'token', 'domain'=>'.example.com', 'path'=>'/'])set_cookie()prefix'prefix'=>'ci_'prefix