我有以下代码来检查登录:
class User extends Password {
private $_db;
function __construct($db) {
parent::__construct();
$this->_db = $db;
}
private function get_user_hash($user) {
try {
$stmt = $this->_db->prepare('SELECT admin_id, user, pass FROM boss WHERE user = :user AND type = "admin"');
$stmt->execute(array('user' => $user));
return $stmt->fetch();
} catch(PDOException $e) {
echo '<p class="bg-danger">'.$e->getMessage().'</p>';
}
}
public function login($user,$password) {
$row = $this->get_user_hash($user);
if($this->password_verify($password,$row['pass']) == 1) {
$_SESSION['loggedin'] = true;
$_SESSION['user'] = $row['user'];
return true;
}
}
public function logout() {
session_destroy();
}
public function is_logged_in() {
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
return true;
}
}
}
$user = new User($db);
一切正常工作,问题是我有两个目录"admin"answers"user"在每个都是"相同的文件",唯一的区别是在每个文件夹是不同的查询设置:
admin: SELECT admin_id, user, pass FROM Boss WHERE user = :user AND type = "admin"
user: SELECT admin_id, user, pass FROM users WHERE user =:user AND type = "user"
当将/admin更改为/user my verification code(上面)时应该区分是否为管理员。因为它不这样做,它通过会话和继续访问作为检查认为是这样。
在每一页"private"上我写了如下内容:
if ($user-> is_logged_in()) {header ('Location: user-area.php');}
我该怎么办?
如果你需要更多的代码来找到解决方案,那就告诉它。
我认为问题是在函数函数"is_logged_in",因为它必须修改配置文件admin检查,否则如果admin例如(不喜欢做某事):
public function is_logged_in_admin() {
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true && $row['type'] == "admin") {
return true;
}
}
,然后检查:if($user->is_logged_in_admin()){header('Location: index.php?ruta=panel');}
这将是很好的,或者什么是正确的方式?
更新:你让它变得更难,然后必须,所有你需要做的就是复制你原来的用户类,并做以下更改
<?php
include('password.php');
class Admin extends Password{
private $_db;
function __construct($db){
parent::__construct();
$this->_db = $db;
}
private function get_user_hash($username){
try {
$stmt = $this->_db->prepare('SELECT password, username, adminID FROM admin WHERE username = :username AND active="Yes" ');
//copy user table, name admin, change memberID to adminID
$stmt->execute(array('username' => $username));
return $stmt->fetch();
} catch(PDOException $e) {
echo '<p class="bg-danger">'.$e->getMessage().'</p>';
}
}
public function login($username,$password){
$row = $this->get_user_hash($username);
if($this->password_verify($password,$row['password']) == 1){
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $row['username'];
$_SESSION['adminID'] = $row['adminID']; //change to adminID
return true;
}
}
public function logout(){
session_destroy();
}
public function is_logged_in(){
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){
return true;
}
}
}
?>
然后为管理员创建一个完全独立的登录/注销页面。如果您需要检查admin,它只是isset($_SESSION['adminID'])
,如果您需要检查用户,它是isset($_SESSION['memberID'])
,如果您需要查看他们是否登录,而不考虑admin或成员,它是isset($_SESSION['loggedin'])
这样99%的代码可以转换为管理端,只需根据会话中的ID更改表。
$table = 'user';
if(isset($_SESSION['memberID'])){
$table = 'admin';
}
作为单独登录的一个额外好处,您可以轻松地为管理员创建不使用密码的用户登录功能。如果您对两者使用相同的会话数据,这是不可能的。