0

我有一个使用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');
    }

}

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

4

1 回答 1

1

看看你的 count($row) 你能指定它是

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();
    }
}

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

class MY_logincontroller extends MY_Controller { // 扩展你在上面创建的类

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");
}

希望这可以为您解决一些问题

于 2013-04-17T11:43:33.070 回答