会话数据自动丢失而无需在codeigniter中单击注销

时间:2013-04-17 11:35:32

标签: php codeigniter session session-variables

我有一个使用codeigniter的Web应用程序,用户大约有200个。如果大约有100个用户同时登录系统,有时用户会自动注销或重定向到登录页面而不点击退出。

我的代码。

登录助手(在Construst中加载以检查登录与否)

function is_logged_in()
{
    //Get Codeigniter Instance
    $obj =& get_instance();

    $is_logged_in = $obj->session->userdata('LOGGED_IN');

    if(!isset($is_logged_in) || $is_logged_in != true)
    {   
        $obj->session->set_flashdata('message','<div class="error_login"><b>ERROR:</b> Silahkan login terlebih dahulu.</div>');

        //If no session, redirect to login page
        redirect('login', 'refresh');
    }

 }

控制器。

public function verify()
{
    $username = $this->input->post('username');
    $password = $this->input->post('password');

    //Query the database
    $row = $this->Loginmodel->verify($username,$password);

    if (count($row)) {

        $dataSession = array(
            'userid' => $row->userid,
            'role' => $row->role,
            'prov_cd' => $row->prov_cd,
            'kab_cd' => $row->kab_cd,
            'LOGGED_IN'=> true,
            'MODAL'=> true
        );

        $this->session->set_userdata($dataSession);

        redirect('dashboard','refresh');

    } 
    else
    {
         $this->session->set_flashdata('message','<div class="error_login"><b>ERROR:</b> Username atau password salah.</div>');
         redirect('login','refresh');
    }

}

我认为这是因为我在会话数据中存储了许多参数。感谢。

1 个答案:

答案 0 :(得分:1)

请查看您的计数($行),请指定它

COUNT($row) == 1

所以我理解你要做什么,如果$ row返回0,那么用户名密码没有验证,如果它返回单个用户示例

== 1

然后用户名是正确的并且确认了。试试这个解决方案。

根据php文档,它不会返回布尔值true或false。试试吧。还有什么错误?

同样为了进一步实现,我引用“计算数组中的所有元素,或对象中的某些内容”。所以只需要打电话

COUNT($row) { // If it is true or not will not work

我怀疑你必须明确说明计数是否= = 1然后是的我们确实得到了一个关于查询的回报让这个人继续。

好吧我还会从CI角度更多地讨论这个话题!

我怀疑你没有检查你的会话是否被设置......我建议你创建一个MY_Controller情况。它非常容易,并且可以减少麻烦......

请看一下这段代码:

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

class MY_Controller extends CI_Controller { // Create your custom controller
    public function __construct() {
        parent::__construct();
    }
}

然后在同一文件中执行以下操作:

类MY_logincontroller扩展MY_Controller {//扩展您在上面创建的类<​​/ p>

public function __construct() { 
    parent::__construct();
    $this -> load -> model('login_model'); // Load your login model
    $loggedin = $this -> session -> userdata('loggedin'); // set your user information
    $username = $this -> session -> userdata('username'); // Set your user information

    if ((!isset($loggedin)) || ($loggedin != TRUE)) { // This will check if the the session variable is set or if it is equal to logged in, if not it will send to a access denied page
        $this -> session -> unset_userdata('loggedin'); // If access denied happens unset user data logged in (just to be sure) and destroy all other session stuff
        $this -> session -> sess_destroy();
        $this -> load -> view('messages/accessdenied_view');
        $this -> output -> _display();
        die();
    }
    $this -> output -> set_header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
    $this -> output -> set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    $this -> output -> set_header('Pragma: no-cache');
    $this -> output -> set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
}

希望这能为你清除一些东西