如果admin

时间:2016-09-07 00:05:00

标签: php mysqli pdo

我有以下代码来检查登录信息:

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

这会很好,或者什么是正确的方式?

1 个答案:

答案 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'])

作为单独登录的额外好处,您可以轻松地将登录作为不使用密码的管理员的用户功能。如果你使用相同的会话数据,这是不可能的。