繁体   English   中英

CodeIgniter会话

[英]CodeIgniter sessions

我是Codeigniter的新手,我在会话方面遇到问题; 即使用户未成功登录,也可能正在启动会话。 或用户成功登录,但是当我浏览站点时,会话再次开始,删除用户信息并在数据库中开始新的会话。

我完全失去了任何帮助,不胜感激。

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-模型

<?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-在应用程序的每个页面之上

<?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>

为什么要使用session_start(); 在您看来。 我看不到在这里有用。

要了解会话库,请使用此链接http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

load->library('session'); 在模型构造函数中或将会话session class设置为autoload

阅读CI文档,它将对您有所帮助。

谢谢。

要从会话中检索值以检查用户是否已登录,请使用功能链接此

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

尝试像这样在construct调用它

$this->verify_login();

因此,当页面加载时,它会在调用该控制器时检查第一个

我建议您在配置文件夹中使用autoload.php ,而不是在每个函数中加载libraryhelper

您可以尝试将模型登录功能更改为此吗

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

和您的控制器登录功能

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

如果要检查用户是否已登录,建议您使用pre_controller挂钩。

如果您感兴趣,还有一些身份验证插件:

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

http://community-auth.com/

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

如果codeigniter会话类仍将会话数据直接存储在cookie中,这会使您感到不舒服,则可以使用db会话类

暂无
暂无

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

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