我通过本指南构建了一个用户登录我的网站: http://www.iluv2code.com/login-with-codeigniter-php.html
我对会话
的问题很少我需要把session_start();在每个控制器中,或者在codeigniter中有一种方法,它将自动在所有控制器中? (我应该这样做吗?)
并且还有另一种方法可以放入每个功能:
if($this->session->userdata('logged_in'))
{
//function code
}else{
//If no session, redirect to login page
redirect('../login', 'refresh');
}
或者我是否应该为每个控制器功能执行此操作(例如,如果我有控制器命名页面并且他具有以下功能:索引,编辑,视图我需要为每个控制器功能添加它?
和最后一个问题,我在view / header调用的每个页面顶部都有注销按钮 我是否也应该使用此功能:
function logout()
{
$this->session->unset_userdata('logged_in');
session_destroy();
redirect('home', 'refresh');
}
在每个控制器中,或者我可以用某种方式做“golbel”功能?
编辑: 我在hooks.php中使用它:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files. Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['post_controller_constructor'] = array(
'class' => 'SessionData',
'function' => 'initializeData',
'filename' => 'loginHelper.php',
'filepath' => 'hooks',
'params' => array()
);
and this in loginHelper.php:
<?
class SessionData {
var $CI;
function __construct(){
$this->CI =& get_instance();
if(!isset($this->CI->session)) //Check if session lib is loaded or not
$this->CI->load->library('session'); //If not loaded, then load it here
}
function initializeData() {
// This function will run after the constructor for the controller is ran
// Set any initial values here
if(!$this->CI->session->userdata('logged_in')){ //call session methods with super object
redirect('../login', 'refresh');
}else{
$data['user'] = $this->CI->session->userdata('logged_in');
}
}
}
?>
/* End of file hooks.php */
/* Location: ./application/config/hooks.php */
用户['数据']未在所有页面中创建。我哪里错了?
答案 0 :(得分:0)
关于退出的第二个问题,我通常会将logout
函数放在User
控制器中并将其称为<a href="<?php echo base_url().'user/logout';?>">Log Out</a>
。
对于您的第一个问题,我看到了一个教程,您将如何在控制器中进行用户登录并在常规控制器中扩展该控制器,这就是您如何避免在每个功能中进行登录检查。我试图找到那个教程,一旦我得到它,我将分享它,但概念就是这样。
答案 1 :(得分:0)
您不需要将session_start();
放在每个控制器中!
您只需在autoload.php
目录的config
文件中启动会话类即可!
$autoload['libraries'] = array('database', 'session', 'encrypt');
此外,最好在类的构造函数内检查用户是否已登录!
if(!$this->session->userdata('logged_in'))
redirect('loginController/loginFunction', 'refresh');
并在注销时销毁所有会话,您可以使用sess_destroy();
答案 2 :(得分:0)
初始化会话
要自动加载会话,请打开application/config/autoload.php
文件,然后将要加载的项目添加到autoload
数组中,以便:$autoload['libraries'] = array('session');
哟不要使用session_start();
和完全session_destroy();
。
要检查登录
使用Hooks来避免繁琐的代码应用,这是更好的做法。浏览页面底部并阅读 Hook Points ,以便您了解相关信息。这很容易!绝对学习钩子。
<强>注销强>
您回答explained here。
答案 3 :(得分:0)
经过多次工作后,我通过登录检查解决了问题。
我没有使用钩子。我在核心文件夹中构建了一个MY_Controller,并在登录控制器的所有控制器中将其释放出来。
在MY_Controller中,我使用登录检查。
CodeIgniter核心控制器: https://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/