关于构造函数死循环的问题
经测试,adminController.class.php控制类文件的构造函数会造成初次登录时死循环,你想啊,每次访问domain/admin.php?controller=admin&method=login这个页面,都会执行一次构造函数,而构造函数内部检测不到 $_SESSION['auth']) 这个变量,势必会
执行$this->showmessage('请登录后在操作!', 'admin.php?controller=admin&method=login');
这个函数,所以,不断alert不断跳回登录界面,然后就PHP 程序就GG了。
public function __construct(){ session_start(); if(!(isset($_SESSION['auth']))&&(PC::$method!='login')){ $this->showmessage('请登录后在操作!', 'admin.php?controller=admin&method=login'); }else{ $this->auth = isset($_SESSION['auth'])?$_SESSION['auth']:array(); } }
因为是构造函数,所以应该每次访问admin控制器的时候,都应该其$_SESSION['auth'](或者登录成功时设置$_SESSION['username'])变量是否存在,如果存在则转入相应的方法页面(方法为login则进入index页面),否则允许进入原方法页面(控制器自己执行无需干扰)
所以建议改成如下:
<?php class adminController { public $auth; function __construct() { session_start(); } function login() { if(!isset($_POST['submit'])&&empty($_SESSION['auth'])) { VIEW::display('admin/login.html'); } else { //POST请求,验证其信息 $this->checkLogin(); } } function checkLogin() { $authObj = M('auth'); if($authObj->loginsubmit())//验证登录信息 { $this->showMsg('登录成功','admin.php?controller=admin&method=index'); } else { $this->showMsg('账号或密码错误,请重新登录','admin.php?controller=admin&method=login'); } } function showMsg($info, $url){ echo "<script>alert('$info');window.location.href='$url'</script>"; exit; } function logout() { unset($_SESSION['auth']); $url = 'http://'.$_SERVER['HTTP_HOST'].'/cmvc/admin.php?controller=admin&method=login'; header('Location: '.$url); } function index(){ if(isset($_SESSION['auth'])) { $newsobj = M('news'); $newsnum = $newsobj->count(); VIEW::assign(array('newsnum'=>$newsnum)); VIEW::display('admin/index.html'); } else { echo "会话超时,请重新登录!"; $url = 'http://'.$_SERVER['HTTP_HOST'].'/cmvc/admin.php?controller=admin&method=login'; header('Location: '.$url); } } } ?>