【问题标题】:how to pass session in controllers如何在控制器中传递会话
【发布时间】:2015-07-30 14:36:04
【问题描述】:

我对 CodeIgniter 中的会话有疑问。 我在登录/提交中初始化会话 然后,如果用户已登录,我必须签入另一个控制器。 所以我会使用:

if ( $this->session->userdata('login_state') == FALSE ) {
      $this->load->view('header');    // no session established, kick back to login page
     }

问题是在我检查 login_state 的控制器中,我不能使用 $this->session 变量。 如果我在此控制器中加载会话库,我将初始化一个新会话,$this->session->userdata('login_state') 将始终为 false。 我试过了:

   $ci = & get_instance();
   $ci->session->userdata('login_state');

但它不起作用。我不知道为什么.. 我不会创建一个类来共享会话变量。有没有明确的方法通过控制器传递会话变量?

登录控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends CI_Controller {
  public function submit() {
            $this->load->library('session');
    // Prendo i dati passati dal form
      $username = $this->input->post('username');
      $password = $this->input->post('password');

    // read user's credentials from db, through Login Model
      if ( $username == "my_username"  && $password == "my_password" )  {
        $this->session->set_userdata('login_state', TRUE);
      } 
      else {
        redirect( '/' );    // redirect back to login page
      }
  }

碎布控制器

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Ragazze extends CI_Controller {    
    public function search()
    {   

    if ( $this->session->userdata('login_state') == FALSE ) {
      $this->load->view('header');    // no session established, kick back to login page
     }
     else{
        $this->load->model('ragazza_model');
        #Prelevo il valore passato tramite post
        $nome_ragazza=$this->input->post('nome');
        if ($nome_ragazza) {
        $nome_ragazza = $this->ragazza_model->get_girl_by_name($nome_ragazza);
        }
        $data['nome_ragazza'] =$nome_ragazza;
        $this->load->helper('form');
        $this->load->model('ragazza_model');
        $this->load->helper('url');
        $this->load->library('form_validation');
        $this->form_validation->set_rules('nome', 'Nome', 'required');

        if ($this->form_validation->run() == FALSE){
        //Questo viene eseguito anche quando il form
        //non `e compilato, cio´e la prima volta che si  -
        //la pagina con il form html
          $this->load->view('header');
          $this->load->view('menu');
          $this->load->view('ragazze/search',$data);
          $this->load->view('footer');
        }
        else{
        //Se i controlli sono positivi, redireziono l' -
          $this->load->view('header');
          $this->load->view('menu');
          $this->load->view('ragazze/search',$data);
          $this->load->view('footer');
        }
       }
       }

config.php

 $config['sess_cookie_name']        = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

编辑:好的,我发现了一些有趣的东西。如果我使用资源管理器..一切正常..所以问题是 Firefox..我不知道为什么。你能帮忙吗?

编辑:我尝试了很多东西..但最后我可能是我的 Firefox 的 cookie 问题。我删除了我的 cookie,现在会话似乎有效。真的,我不知道是不是这个问题。我还更改了配置中的某些内容,但在删除我的 cookie 之前它不起作用。所以伙计们,如果你对 Firefox 有同样的问题(在资源管理器中导致会话,所以相同的代码,工作)尝试删除你的 cookie。如果有人对这个奇怪的事情有答案,我会很感激的。

【问题讨论】:

  • 您使用的是哪个版本的 CI?
  • 在你的config.php,你能提供你的会话配置是如何设置的吗?
  • 你能在Login/submit中显示初始化会话的代码吗?
  • 当然。阅读第一篇文章:)
  • 好吧,我不能说我没有尝试过.. 我不知道问题可能是什么。希望这里有人能够为您找到答案。祝你好运。

标签: php codeigniter session controller


【解决方案1】:

在您的 autoload.php 配置文件中,像这样自动加载会话:

$autoload['libraries'] = array('session');

现在您无需再次加载它,也无需“传递”会话变量。它们可以随处使用。

【讨论】:

  • 我试过了,但这不起作用。在每个控制器中加载会话库都是一样的。每次我访问一个页面时,都会在我的数据库上创建一个新会话。这不好。但是,我用控制器编辑了我的帖子
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多