【问题标题】:Codeigniter, $_SESSION arraysCodeigniter,$_SESSION 数组
【发布时间】:2010-10-01 07:57:38
【问题描述】:

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

是否有人仍然只使用 $_SESSION 数组,放弃默认的 $_COOKIE 数组选项?我的意思是,我想要会话数据而不是 cookie 数据,但这似乎是不可能的:O!!!??!!

我已将 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) 控制器主页.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[] 数据不会出现!!!

【问题讨论】:

  • 我在本地主机的 xampp 上使用 CI,你的意思是什么?对不起,我的英语很糟糕:/

标签: php session codeigniter cookies


【解决方案1】:

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

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

底线 - 如果您想要网络环境中的会话数据,则需要启用 cookie。对不起。

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

【讨论】:

  • 抱歉,$_SESSION 不是 cookie,我的意思是 :P,如果 cookie 被关闭,我应该可以检索 $_SESSION,你不觉得吗?
  • 我不能使用cookie来建立项目
  • 这很简单:会话通过 cookie 或 URL 参数进行管理。如果您关闭了 cookie,则必须在每次页面加载时包含会话 URL 参数,否则您将无法检索会话数据。请参阅有关会话的 PHP 手册页以确认这一点:php.net/manual/en/intro.session.php
  • 是的,现在我正在尝试使用普通的 php 脚本从框架中取回 $_SESSION 数据,但是当禁用 cookie 时我仍然无法检索 $_SESSION :/,我认为这是是 php.ini 的问题,你不觉得吗?
【解决方案2】:

如果我们使用session_start();,我们可以使用$_SESSION 问题是,$_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();
}

system/core/Controller.php 上的CI_Controller

成功了!

【讨论】:

    【解决方案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 是一个框架,您不需要使用所有它。

    【讨论】:

    • 好的,我会使用更大的帖子 :) 让我 1 分钟:P 我将发布所有代码
    • 这只是存储会话数据,与SID Tracking无关,它完全取决于cookie或GET参数,这只是存储会话数据的不同驱动程序。
    • 所以没有办法使用个人 $_SESSION 数组? :O
    【解决方案4】:

    CodeIgniter 从什么时候开始“阻止”$_SESSION?如果要使用会话,则必须启动它。为此,您需要在某处编写 session_start() 。为什么不在你的 index.php 中?

    CodeIgniter 只是 PHP,不是什么邪恶的黑魔法师。

    【讨论】:

    • 是的,我在 1) 个人库的开头写了 session_start,如您所见,我认为 CI 在加载库时会启动此选项,或者不正确? :P
    • 抱歉,您的代码格式错误,我错过了。你为什么要为此创建一个库?如果你想使用 $_SESSION 那就去做吧,然后像往常一样修改。我已经使用这种确切的方法多次使用 $_SESSION。
    【解决方案5】:

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

    【讨论】:

    • sorry 是否意味着我无法检索我设置的 $_SESSION?
    • 需要我尝试设置其他会话 ID 吗? :P
    【解决方案6】:

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

    见:http://www.php.net/manual/en/session.idpassing.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多