请教下 CI 2.x版本 Session 怎么不能跨多个控制器啊

请教下 CI2.0版本 Session 怎么不能跨多个控制器啊

请教一个问题,我的程序在本地运行正常,上传到服务器以后seesion丢失,具体调试的结果是这样的:

给seesion赋值了以后,输出:
echo $this->session->userdata("logged_in"); / /可以看到 值为 1,session的值还在,
redirect('homepage'); // 跳转到另一个controller,

在 homegpage 这个controller里,第一行代码调用
echo $this->session->userdata("logged_in"); 就已经取不到值了。

请问是什么问题,如何解决

网上说 有如下可能引起此问题:
1. 本地时间与服务器时间不一致,导致session过期
2. session 里面存在中文
3. POST请求之后不能使用 302来重定向,必须使用307
4. 人品问题

色色
编辑于2012-02-19
评论 (2)链接2012-02-11 
  • 0 支持
    session_start()写在哪里? – 小飞 2012-02-20
  • 0 支持
    程序的运行环境是什么?还有调试的浏览器是什么? – 浪际天涯 2012-02-20

把下面代码替换CI里的session类

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*
* 自定义的session类
*
*/
class CI_Session {
var $sess_time_to_update = 300;
var $time_reference = 'time';
var $now;
var $CI;

/**
* Session Constructor
*
* The constructor runs the session routines automatically
* whenever the class is instantiated.
*/
public function __construct($params = array())
{
if(!isset($_SESSION)){
session_start();
}
}
// --------------------------------------------------------------------

/**
* Destroy the current session
*
* @access public
* @return void
*/
function sess_destroy()
{
// Kill the session DB row
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}

// --------------------------------------------------------------------

/**
* Fetch a specific item from the session array
*
* @access public
* @param string
* @return string
*/
function userdata($item)
{
return ( !isset($_SESSION[$item])) ? FALSE : $_SESSION[$item];
}

// --------------------------------------------------------------------

/**
* Fetch all session data
*
* @access public
* @return mixed
*/
function all_userdata()
{
return ( ! isset($_SESSION)) ? FALSE : $_SESSION;
}

// --------------------------------------------------------------------

/**
* Add or change data in the "userdata" array
*
* @access public
* @param mixed
* @param string
* @return void
*/
function set_userdata($newdata = array(), $newval = '')
{
if (is_string($newdata))
{
$newdata = array($newdata => $newval);
}
foreach($newdata as $k=>$v) $_SESSION[$k] = $v;
return true;
}

// --------------------------------------------------------------------

/**
* Delete a session variable from the "userdata" array
*
* @access array
* @return void
*/
function unset_userdata($newdata = array())
{
if (is_string($newdata))
{
$newdata = array($newdata => '');
}
foreach($newdata as $k) $_SESSION[$k] = '';
return true;
}
}

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-19

这个问题贴出之后,直到今天仍然没有人能够提供精确的答案,但是活被催的紧,没办法,只能重写了一个SESSION包装器,真的很无语,CI的作者到底是怎么想的,此处贴出自己的解决方法,期待大家更好的方案

  
<?php
/**
* 因为 CI框架库自身对Session支持的问题,使得 服务器端Session存储竟然
* 依赖 客户端浏览器 ,无语... 个人对CI开发者无语...
*
* 不知道其具体是怎么想的..
*
* @author 色色 vb2005xu.iteye.com
*
*/
class My_Session {

private static $key_userdata = '#userdata+-';
private static $key_flashmem = '#flashmem+-';

function __construct(){
if (!headers_sent()){ session_start();}
}

function __destruct(){
// 析构函数,删除 flashmem
if (isset($_SESSION[self::$key_flashmem])){
unset($_SESSION[self::$key_flashmem]);
}
}

function userdata($item){
$D = isset($_SESSION[self::$key_userdata]) ? $_SESSION[self::$key_userdata] : FALSE;
return $D && is_array($D) && isset($D[$item]) ? $D[$item] : FALSE;
}

private function init_userdata(){
if (isset($_SESSION[self::$key_userdata]) && is_array($_SESSION[self::$key_userdata]))
return true;
$_SESSION[self::$key_userdata] = array();
}

function set_userdata($newdata = array(), $newval = ''){

$this->init_userdata();

if (is_string($newdata))
{
$newdata = array($newdata => $newval);
}

if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
$_SESSION[self::$key_userdata][$key] = $val;
}
}
}

function unset_userdata($newdata = array())
{

$this->init_userdata();

if (is_string($newdata))
{
$newdata = array($newdata => '');
}

if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
unset($_SESSION[self::$key_userdata][$key]);
}
}
}

function all_userdata()
{
return isset($_SESSION[self::$key_userdata]) ? $_SESSION[self::$key_userdata]:FALSE;
}

function sess_destroy(){
// THROW NEW EXCEPTION('D');
session_destroy();
}

private function init_flashdata(){
if (isset($_SESSION[self::$key_flashmem]) && is_array($_SESSION[self::$key_flashmem]))
return true;
$_SESSION[self::$key_flashmem] = array();
}

function set_flashdata($newdata = array(), $newval = '')
{
$this->init_flashdata();

if (is_string($newdata))
{
$newdata = array($newdata => $newval);
}

if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
$_SESSION[self::$key_flashmem][$key] = $val;
}
}
}

function flashdata($item)
{
$D = isset($_SESSION[self::$key_flashmem]) ? $_SESSION[self::$key_flashmem] : FALSE;
return $D && is_array($D) && isset($D[$item]) ? $D[$item] : FALSE;
}

}
小飞
小飞
6842
编辑于 2012-02-20
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-19

刚才看了一篇文章,感觉说的挺在理,你可以看下:
http://hi.baidu.com/xyublog/blog/item/a461df14af0e814020a4e9b0.html

希望能帮到你

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-20

CI2.0,还没用过。但CI1.*时,CI的session类,事实上只使用了cookie,程序里根本无session_start()。而cookie的存储,是要完成在客户端的写入的。
两种解决方案:
1,放弃CI session,使用php本身的session机制
2,使用CI session,使用html或js进行页面跳转

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23
  1. 修改php.ini吧timezone设置成Asia/Chongqing,或者ini_set函数设置时区,查看是否可以了
  2. session内容可以序列化或者json_encode之后看看可否
  3. POST请求之后的问题,我不清楚,不过可以把跳转函数换一下,试试header和js的跳转
  4. 第四个问题,我不予回答。不过应该确认这个controller应该是也把session这个library给load进来了。
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-02-13
  • 0 支持
    session库肯定加进来了,这个问题是CI官方 session库的问题 – 色色 2012-02-20

我这边的项目就是CI2.x开发的。 session没有问题~~应该不是CI的问题吧

很久以前我也遇到你说的这个情况了。后来一顿摸索,解决了~~但怎么解决的~~我忘了!!!!

你先看看,服务器上的时间是不是和你本地的时间不对!!

例如,你本地是2月23日。而服务器时间是3月15日。(你先试试,我继续回忆回忆)

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-23

使用php原生session呢?

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-24
德问是一个专业的编程问答社区,请 登录注册 后再提交答案