【问题标题】:Codeigniter 3 and sessionCodeigniter 3 和会话
【发布时间】:2015-11-27 23:21:22
【问题描述】:

我的会话在 2.x 版本的 CI 中运行良好。我曾经使用默认的 CI 会话选项(我相信是浏览器)保存它们,但我现在决定使用数据库。我已经在配置文件中设置了表和其他所有内容。问题是我从来没有得到任何错误。会话和加密库在自动加载配置文件中。在我的模型中,我使用以下代码将数据放入会话中:

$this->session->set_userdata(array(
  'email' => $email,
  'is_logged_in' => 1)
); 

但是当我尝试使用时:

var_dump($this->session->userdata());

我得到以下输出:

array(1) { ["__ci_last_regenerate"]=> int(1448664996) }

没有任何内容被添加到会话中,没有错误出现。有人可以帮忙吗?

编辑:

config.php

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'mydomain';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

自动加载.php

$autoload['libraries'] = array('database', 'email', 'encryption', 'session');

我已按照文档显示的所有说明进行操作。

编辑 2:

控制器:

public function login_into_site()
    {
        if($this->input->post('viaAjax') == 1)
        {
            $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|callback_validate_credentials');
            $this->form_validation->set_rules('password', 'Password', 'required|md5|trim');
            $user_url = base64_decode($this->input->post('rand'));

            if ($this->form_validation->run())
            {
                $sulo = array();
                $sulo['res'] = '1';
                $sulo['address'] = $user_url;
                echo json_encode($sulo);
            }
            else
            {
                $formError = array();
                $formError['email'] = form_error('email');
                $formError['password'] = form_error('password');
                echo json_encode($formError);
            }
        }
        else
        {
            echo json_encode("fail");
        }
    }

    public function validate_credentials()
    {
        $this->load->model('user/model_user_auth');
        $this->model_user_auth->can_log_in($message);
        if($message == 1)
        {
            return true;
        }
        else if($message == 2)
        {
            $this->form_validation->set_message('validate_credentials','not activated');
            return false;
        }
        else
        {
            $this->form_validation->set_message('validate_credentials','bad username or password');
            return false;
        }
    }

型号:

public function can_log_in(&$message)
    {
        $email = $this->input->post('email');
        $this->db->where('email',$email);
        $this->db->where('password',md5($this->input->post('password')));
        $query = $this->db->get('users');
        $message = '';
        if($query->num_rows() == 1)
        {
            $this->session->set_userdata(array(
                'email' => $email,
                'is_logged_in' => 1)
            );

            foreach ($query->result() as $row)
            {
                $activated = $row->activate;
                $membership = $row->membership;
            }
            if($activated == NULL && $membership == 'a')
            {
                $message = 1; //success
            }
            else if($activated != NULL && $membership == 'a')
            {
                $message = 2; //not activated
            }
            else
            {
                $message = 3; // user exist but info wrong
            }
        }
        else
        {
            $message = 0; // user does not exist
        }
    }

模型生成$message = 1;,因为我在控制器回调函数和控制器函数中返回为“TRUE”,使用户在没有任何错误的情况下继续进行

【问题讨论】:

  • 你创建的表,是CI2还是CI3?
  • @Tpojka 用于 CI3。我是从codeigniter.com/user_guide/libraries/sessions.html 那里得到的
  • 为什么提到 CI2?
  • @Tpojka "我的会话在 2.x 版本的 CI 中工作正常",曾经在 2.x 中工作,但在 3 中不起作用
  • @Tpojka 如果有帮助,我已经添加了配置信息。我感到困惑的原因是因为代码看起来不错,没有错误,但它没有保存会话信息。其余代码执行得很好。即使我输入$_SESSION['email'] = $email 它也不起作用,但是如果我输入session_start(); 我会收到一个错误,表明会话已经开始

标签: php codeigniter session codeigniter-3


【解决方案1】:

解决了。问题是我的 cookie 覆盖了数据库会话。在配置文件中如果使用数据库进行会话,此行不能有值"

$config['sess_cookie_name'] = 'mydomain';

为了使会话使用数据库工作,该值必须为空:

$config['sess_cookie_name'] = '';

如果它不为空,CI 将默认为您的会话使用 cookie。这并不意味着您不能使用 cookie。您只需通过帮助程序加载它们,它们就可以正常工作。

【讨论】:

  • 请说明您的信息来源?我正在使用 redis 会话并将会话 ID 存储在带有名称的 cookie 中,一切都很好。很想进一步了解您的上述观点。
猜你喜欢
  • 2015-04-07
  • 2015-07-07
  • 1970-01-01
  • 2018-04-07
  • 2015-10-06
  • 2015-09-13
  • 2021-12-25
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多