简体   繁体   English

CodeIgniter会话

[英]CodeIgniter sessions

I am new to Codeigniter and I am having a problem with sessions; 我是Codeigniter的新手,我在会话方面遇到问题; Either a session is starting even when the user does not log in successfully. 即使用户未成功登录,也可能正在启动会话。 Or The user logs in successfully but when I navigate the site the session starts again dropping the user information and starting a new session in my database. 或用户成功登录,但是当我浏览站点时,会话再次开始,删除用户信息并在数据库中开始新的会话。

I am completely lost any help greatly appreciated. 我完全失去了任何帮助,不胜感激。

site.php - Controller site.php-控制器

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

class Site extends CI_Controller {

public function __construct()
{
    parent::__construct();
    $this->load->model('user_model');
}

public function index()
{
    $this->load->library('session');
    $this->load->helper('url');
    $data['title']= "Welcome Learn Guitar Online";
    $this->load->view('header',$data);
    $this->load->view('home',$data);
    $this->load->view('footer',$data);
}

public function form()
{
    $this->load->library('session');
    $this->load->helper('url');
    $data['title']= "Login";
    $this->load->view('header',$data);
    $this->load->view('form',$data);
    $this->load->view('footer',$data);
}
    public function login()
{
    $loginEmail=$this->input->post('loginEmail');
    $loginPassword=$this->input->post('loginPassword');

    $result=$this->user_model->login($loginEmail,$loginPassword);
    if($result) $this->myaccount();
    else        $this->form();
}
}

user_model.php - Model user_model.php-模型

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class User_model extends CI_Model {

public function __construct()
{
    parent::__construct();
}
function login($email,$password)
{
$password = sha1($password);

    $this->db->where("Email",$email);
    $this->db->where("Password",$password);

    $query=$this->db->get("members");
    if($query->num_rows()>0)
    {
        foreach($query->result() as $rows)
        {
            //add all data to session
            $newdata = array(
                    'user_id'       => $rows->Id,
                    'user_name'     => $rows->First_Name,
                    'user_email'    => $rows->Email,
                    'logged_in'     => TRUE,
               );
        }
            $this->session->set_userdata($newdata);
            return true;            
    }
    return false;
 }
public function add_user()
{
    $data=array(
        'username'=>$this->input->post('user_name'),
        'email'=>$this->input->post('email_address'),
        'password'=>md5($this->input->post('password'))
        );
    $this->db->insert('user',$data);
}
}
?>

header.php - On top of every page on application header.php-在应用程序的每个页面之上

<?php
$sid = $this->session->all_userdata();

if($sid) {
print_r($this->session->userdata); ;
} else {
session_start();
}
?>  
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title><?php echo $title; ?></title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<link rel="stylesheet" type="text/css" href="<?php echo base_url(). "assets/css/style.css"; ?>"/>
<link rel="stylesheet" type="text/css" href="<?php echo base_url(). "assets/css/skeleton.css"; ?>" />
<link rel="stylesheet" type="text/css" href="<?php echo base_url(). "assets/css/layout.css"; ?>" />
<link rel="stylesheet" type="text/css" href="<?php echo base_url(). "assets/css/base.css"; ?>" />

<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/jquery-1.2.6.min.js"; ?>"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/script.js"; ?>"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/jquery.tablesorter.pager.js"; ?>"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/jquery.tablesorter.min.js"; ?>"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/jquery.tablesorter.js"; ?>"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo base_url(). "assets/js/comment.js"; ?>"></script>

<!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

<link rel="shortcut icon" href="images/favicon.ico">
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">

 </head>

Why are using session_start(); 为什么要使用session_start(); in your view. 在您看来。 i cant see that has a use here. 我看不到在这里有用。

to learn about session library use this link http://ellislab.com/codeigniter/user-guide/libraries/sessions.html 要了解会话库,请使用此链接http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

load->library('session'); in your model constructor or set session class to autoload . 在模型构造函数中或将会话session class设置为autoload

Read CI doc it will help you. 阅读CI文档,它将对您有所帮助。

thanks. 谢谢。

To retrive value from session to check wheather the user is logged in or not, use function link this 要从会话中检索值以检查用户是否已登录,请使用功能链接此

public function verify_login(){
        if($this->session->userdata('logged_in')!=TRUE){
            redirect('site');
        }
    }

Try calling this in construct like this 尝试像这样在construct调用它

$this->verify_login();

so when the page loads, it checks for this 1st when that controller is called 因此,当页面加载时,它会在调用该控制器时检查第一个

instead of loading library & helper in every function, i suggest you to use autoload.php in config folder 我建议您在配置文件夹中使用autoload.php ,而不是在每个函数中加载libraryhelper

can you try changing the model login function to this 您可以尝试将模型登录功能更改为此吗

public function login(){

    $this->db->where('Email',$this->input->post('loginEmail'));
    $this->db->where('Password',sha1($this->input->post('loginPassword')));
    $query=$this->db->get("members");
    if($query->num_rows == 1){
        foreach ($query->result() as $rows){
            $newdata = array(
                'user_id'       => $rows->Id,
                'user_name'     => $rows->First_Name,
                'user_email'    => $rows->Email,
                'logged_in'     => TRUE
            );
        }
        $this->session->set_userdata($newdata);
        return true;
    } else {
        return false;
    }
 }

and your controller login function to this 和您的控制器登录功能

public function login(){

    $this->load->library('form_validation');
    $this->form_validation->set_rules('loginEmail','Email','trim|required|valid_email');
    $this->form_validation->set_rules('loginPassword','Password','trim|required');

    if($this->form_validation->run() == FALSE){
            //Do what you have to do if validation failed
    } else {
        $this->load->model('User_model');
        $result=$this->User_model->login();

        if($result){
            $this->myaccount();
        } else {
            $this->form();
        }
    }
}

If you want to check if user is logged in or not I would suggest you to use a pre_controller hook. 如果要检查用户是否已登录,建议您使用pre_controller挂钩。

And there is some authenticate plugin if you interest: 如果您感兴趣,还有一些身份验证插件:

http://haseydesign.com/flexi-auth/ http://haseydesign.com/flexi-auth/

http://community-auth.com/ http://community-auth.com/

http://konyukhov.com/soft/tank_auth/ http://konyukhov.com/soft/tank_auth/

If codeigniter session class still stores session data directly inside the cookie, and this make you feel uncomfortable you can use db session class 如果codeigniter会话类仍将会话数据直接存储在cookie中,这会使您感到不舒服,则可以使用db会话类

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM