CodeIgniter 2.2.3 Session取值为空:跨方法无法获取已设置Session值
解决CodeIgniter 2.2.3中Session数据跨方法获取为空的问题
看起来你遇到了CodeIgniter 2里Session设置后跨方法拿不到数据的典型问题,我来帮你一步步排查和解决:
核心排查方向与解决方案
1. Session存储路径权限或配置问题
CodeIgniter 2默认会把Session文件存在系统临时目录,但如果这个目录没有读写权限,Session数据根本没法持久化,导致下一个请求拿不到之前的数据。
解决步骤:
- 在
application/config/config.php里手动指定Session存储路径:
$config['sess_save_path'] = APPPATH . 'cache/sessions/';
- 在
application/cache下创建sessions目录,给它设置合适的权限(比如chmod 700,确保服务器进程能读写)。
2. Cookie配置导致Session无法跨请求传递
CodeIgniter 2的Session默认依赖Cookie传递Session ID,如果Cookie参数设置不对,新请求就带不上Session ID,自然拿不到之前的数据。
检查这些配置项(同样在config.php里):
// 确保Cookie的路径是网站根目录,避免子目录无法访问 $config['cookie_path'] = '/'; // 域名设置要和你的网站一致,本地测试可以留空或设为localhost $config['cookie_domain'] = ''; // 如果不是HTTPS环境,设为FALSE $config['cookie_secure'] = FALSE;
3. Session ID不一致问题
两个方法的请求如果用了不同的Session ID,肯定拿不到同一份数据。你可以在两个方法里分别打印Session ID验证:
// 在Contact_View_Get里 echo "Session ID in Get: " . session_id(); // 在Contact_View里 echo "Session ID in View: " . session_id();
如果ID不同,说明Cookie没传递过来,回到上面的Cookie配置排查。
4. 超大Session数据导致Cookie溢出
你把$data['list']整个数组存在Session里,如果这个数组太大,超过了Cookie的4KB大小限制,数据就会丢失。
解决办法:改用数据库存储Session
- 在
config.php里开启数据库存储:
$config['sess_use_database'] = TRUE; $config['sess_table_name'] = 'ci_sessions';
- 在你的数据库里创建对应表:
CREATE TABLE IF NOT EXISTS `ci_sessions` ( `session_id` varchar(40) DEFAULT '0' NOT NULL, `ip_address` varchar(45) DEFAULT '0' NOT NULL, `user_agent` varchar(120) NOT NULL, `last_activity` int(10) unsigned DEFAULT 0 NOT NULL, `user_data` text NOT NULL, PRIMARY KEY (session_id), KEY `last_activity_idx` (`last_activity`) );
5. 请求跨域或Session匹配设置过严
- 如果
Contact_View_Get是AJAX请求、Contact_View是页面跳转,要确保两者域名完全一致(包括HTTP/HTTPS、端口),否则Cookie不会跨域传递。 - 检查
config.php里的sess_match_ip和sess_match_useragent:如果sess_match_ip设为TRUE,而你的请求IP有变化(比如用了代理),会导致Session失效,建议先暂时设为FALSE测试。
代码小优化
你的代码里有个细节可以调整:在Contact_View里用了$_SESSION['deliverdata'],但CodeIgniter 2里更推荐用框架自带的$this->session->userdata('deliverdata')来获取,避免兼容问题。
另外,确保你已经加载了Session库,最好在application/config/autoload.php里全局加载:
$autoload['libraries'] = array('session');
内容的提问来源于stack exchange,提问作者sam christy
相关产品推荐
相关产品推荐

