Codeigniter,$ _SESSION数组

时间:2010-10-01 07:57:39

标签: php session codeigniter cookies

我正在尝试在Codeigniter中使用原生的$ _SESSION数组,因为我无法使用$ _COOKIES数组, 所以我做了自己的课,但似乎Codeigniter继续保存cokkies数据导致如果我禁用浏览器cookie我无法检索$ _SESSION数据:O !!不可思议....我不明白为什么? codeigniter是停止还是删除所有设置的$ _SESSION数据?

有人还在使用$ _SESSION数组,中止默认的$ _COOKIE数组选项吗?我的意思是,我希望会话数据不是cookie数据,但似乎是不可能的:哦!!! ?? !!

我已将CI原始Session.php库重命名为Cookie.php,并且我将两个个人类重命名为应用程序/库,并将其默认加载到autoloader.php

1)个人图书馆 - Session.php

session_start();

class Session {


     function set_data($key,$data)
    {

      if(!$key)
      { echo 'first param passed is null in session set_data';}
      if(!$data)
      { echo 'second param passed is null in session set_data';}
     if(isset($key) && isset($data))
     {
         if(isset($_SESSION[$key]))
         {
             unset($_SESSION[$key]);
         }

      return $_SESSION[$key] = $data;


     }
  function keep_data($key)
    {

       if(!$key)
      { echo 'first param passed is null in session keep_data';}

       if(isset($_SESSION[$key]))
       {
         return htmlentities($_SESSION[$key]);
       }
    }

2)个人图书馆 - Settings.php

class Settings {


     function setsitelanguage()
    {
        $CI =& get_instance();

        if($CI->session->keep_data('lang'))
        {
            $CI->config->config['language'] = $CI->session->keep_data('lang');
        }
        else
        {
          $CI->config->config['language'] = "en";
        }

    } 

比我有2个控制器


1)Controller Home.php

class Home extends Controller {

    function Home()
    {

        parent::Controller();

               $this->settings->setsitelanguage();

        }


    function index()
    {
        $this->load->view('home/home_view');

    }
        function session()
        {
           echo   $this->session->keep_data('lang');
        }

} 

2)控制器Auth.php

class Auth extends Controller {


     function usersetlang()
    {

               $lang = $this->uri->segment(3);

              return $this->session->set_data('lang',$lang);





        }
}

http://mysite/index.php/home/session所示,我可以通过auth.php检索与session.php一起存储的语言网站 唯一的问题是使用全局$_SESSION[]是不够的,因为如果我尝试检索数据,禁用我的浏览器cookie $_SESSION[]数据不会出现!

6 个答案:

答案 0 :(得分:6)

$ _ SESSION变量可能不在cookie本身,但PHP仍然需要能够跟踪用户的会话,以便$ _SESSION变量是持久的,并且它使用cookie进行跟踪。

如果关闭cookie,PHP会尝试来维持会话状态,方法是在URL中传递会话变量,但它不是很可靠。

底线 - 如果您想在网络环境中使用会话数据,则需要启用Cookie。遗憾。

你说你不能使用cookies,但你没有真正解释原因。这些天人们想要关闭cookie是相当不寻常的,因为它们几乎无处不在。

答案 1 :(得分:5)

如果我们$_SESSION,我们可以使用session_start(); 问题是,$_SESSION不会在codeigniter上的页面上工作。

快速修复:

由于mvc中的页面是由控制器触发的,我们可以这样做

public function __construct(){
    self::$instance =& $this;
    foreach (is_loaded() as $var => $class) {
        $this->$var =& load_class($class);
    }

    $this->load =& load_class('Loader', 'core');

    $this->load->initialize();

    log_message('debug', "Controller Class Initialized");
    session_start();
}

CI_Controller

上的system/core/Controller.php班级

有效!

答案 2 :(得分:3)

是的,你可以那样做

创建此表:

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(16) DEFAULT '0' NOT NULL,
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id)
);

并在配置中更改此内容:

$config['sess_use_database'] = FALSE;

$config['sess_use_database'] = TRUE;

$config['sess_table_name'] = 'ci_sessions';应与您的表名匹配。

澄清 - 默认情况下,CI的会话系统使用cookie来存储数据。不知道为什么,它只是。您可以使用数据库表来更改此安全性等。

您访问的会话值完全相同,但不受Cookie最大文件大小或安全风险的限制。

您当然可以使用普通的$ _SESSIONS并创建自己的脚本 - 记住CI是一个框架,您不需要使用它。

答案 3 :(得分:2)

CodeIgniter什么时候“阻止”$ _SESSION?如果要使用会话,则必须启动它。要做到这一点,你需要在某处编写session_start()。为什么不在你的index.php?

CodeIgniter只是PHP,而不是一些邪恶的黑魔法师。

答案 4 :(得分:0)

有一个存储PHPSESSID浏览器端的cookie。

答案 5 :(得分:0)

如果您无法通过Cookie传播会话ID,则可以通过URL进行传播。

请参阅:http://www.php.net/manual/en/session.idpassing.php