Php 针对不同类型用户的单一登录页面

Php 针对不同类型用户的单一登录页面,php,mysql,Php,Mysql,我正在开发一个应用程序,它允许用户注册为类别1或类别2或两者。简单地说,用户可以使用相同的详细信息在类别1下注册,也可以在类别2下注册 有了这一点,我想到了一些在数据库中存储用户详细信息的方法: 使用单个表,在其中我将使用角色或权限区分类别 使用两个表,我将根据用户的选择(注册后)将用户存储在各自的表中 在考虑以下事项后: 用户可以选择在这两个类别中注册 用户可以决定对这两个类别使用相同的详细信息 我得出一个结论,我的选择一不会给我想要的 现在,在我的代码中,我创建了我的User类,用于注册

我正在开发一个应用程序,它允许用户注册为类别1类别2或两者。简单地说,用户可以使用相同的详细信息在类别1下注册,也可以在类别2下注册

有了这一点,我想到了一些在数据库中存储用户详细信息的方法:

  • 使用单个表,在其中我将使用角色或权限区分类别
  • 使用两个表,我将根据用户的选择(注册后)将用户存储在各自的表中
  • 在考虑以下事项后:

    • 用户可以选择在这两个类别中注册
    • 用户可以决定对这两个类别使用相同的详细信息
    我得出一个结论,我的选择一不会给我想要的

    现在,在我的代码中,我创建了我的
    User
    类,用于注册和登录用户

    class User {
        private $_db,
                $_data,
                $_sessionName,
                $_isLoggedIn;
    
        public function __construct($user = null) {
            $this->_db = DB::getInstance();
    
            $this->_sessionName = Config::get('session/session_name');
    
            if(!$user) {
                if( Session::exists($this->_sessionName) ) {
                    $user = Session::get($this->_sessionName);
    
                    if( $this->find($user) ){
    
                        $this->_isLogggedIn = true;
    
                    } else {
    
                        $this->logout();
    
                    }
                }
            } else {
    
                $this->find($user);
    
            }
        }
    
        public function find($user = null) {
            if($user) {
                $field = (is_numeric($user)) ? 'id' : 'email';
    
                if ( $packageType == 'category1' ) {
                    $fCheck = $this->_db->get('table_name', array($field, '=', $user));
    
                    if( $fCheck->count() ) {
                        $this->_data = $fCheck->first();
                        return true;
                    }
                }
                elseif ( $packageType == 'category2' ) {
                    $iCheck = $this->_db->get('table_name', array($field, '=', $user));
    
                    if($iCheck->count()) {
                        $this->_data = $iCheck->first();
                        return true;
                    }
                }
            }
            return false;
        }
    
        public function login($userInput = null, $password = null) {
            $user = $this->find($userInput);
    
            if($user) {
                if(password_verify($password, $this->data()->password)) {
                    Session::put($this->_sessionName, $this->data()->id);
                    return true;
                }
    
            }
    
            return false;
        }
    
        public function logout() {
            Session::delete($this->_sessionName);
        }
    
        public function data() {
            return $this->_data;
        }
    
        public function isLoggedIn() {
            return $this->_isLogggedIn;
        }
    }
    
    使用单个表时,代码不必在我的
    find()
    方法中定义或检查
    $packageType
    ,但正如我指出的,我需要将它用于不同的表

    我现在遇到的问题是如何使用
    user
    类检查用户登录的特定包,并获取该特定表的相应用户详细信息


    任何帮助都将不胜感激。

    TL;DR:制定一个解决方案,使用您现有的两个选项来更好地组织系统中的信息

    使用数据库当前的方式(仅两个表),必须在两个表上找到用户。这意味着您首先搜索其中一个,如果找不到用户,则搜索另一个。这意味着您必须找出一个优先级系统,其中一个表的优先级高于另一个表

    然而,正如你之前所说:

    我得出一个结论,我的选择一不会给我想要的

    它实际上并不能完全解决您的问题,因为您需要您的用户以一个用户名登录,并且可以访问这两个类别

    因此,由于第一个选项只能解决一半的问题,让我们检查另一个。
    选项2为用户使用一个表。这很好,因为这意味着每个用户都有一个用户名。但是,您的需求需要两个表(可能category1有category2没有的东西,或者category2没有的东西),所以这不适合

    因为选项1是解决方案的一半,选项2是另一半,所以让我们同时使用这两个选项

    您的数据库现在将有三个表:category1表、category2表和用户表。您的类别表将包含特定于您的类别的用户信息,并且您的用户表将包含每个用户的用户名和密码信息。
    您的类别表没有主键,只有外键(引用用户表的主键)。登录时,您的系统必须询问用户希望登录到哪个类别。在他选择一个类别后,您可以根据用户选择的类别1或类别2搜索用户信息

    就这样!您现在有了一个登录系统,该系统支持具有多个权限级别和用户信息的多个用户