我有以下代码来检查登录信息:
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);
一切正常,问题是我有两个目录&#34; admin&#34;和&#34;用户&#34;每个内容都是#34;相同的文件&#34;唯一的区别是每个文件夹中的设置是不同的查询:
admin:SELECT admin_id, user, pass FROM Boss WHERE user = :user AND type = "admin"
用户:SELECT admin_id, user, pass FROM users WHERE user =:user AND type = "user"
当更改/管理员/用户我的验证码(上图)应该区分是否是管理员。因为它没有,它会通过会话并继续访问,因为检查是这样的。
在每一页上&#34;私人&#34;我提出以下内容:
if ($user-> is_logged_in()) {header ('Location: user-area.php');}
我该怎么办?
如果您需要更多代码来找到解决方案,那就明白了。
我认为问题出在功能函数&#34; is_logged_in&#34;因为它必须修改配置文件管理员以检查管理员,例如管理员(不喜欢做某事):
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');}
这会很好,或者什么是正确的方式?
答案 0 :(得分:1)
更新:你必须做得更难,所有你需要做的就是复制你的oringal用户类并进行以下更改
<?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;
}
}
}
?>
然后为管理员创建一个完全独立的登录/注销页面。如果您需要检查管理员,只需isset($_SESSION['adminID'])
,如果您需要检查用户是否为isset($_SESSION['memberID'])
,是否需要查看他们是否已登录,无论管理员或成员是谁{{1 }}
这样,只需根据会话中的ID更改表格,就可以将99%的代码转换为管理员。
isset($_SESSION['loggedin'])
作为单独登录的额外好处,您可以轻松地将登录作为不使用密码的管理员的用户功能。如果你使用相同的会话数据,这是不可能的。