首页 > 解决方案 > public __construct ,检索用户信息类

问题描述

我正在寻找创建一个类并私下检索帐户信息,然后公开 Getters 您对改进此代码有什么建议吗?

    private $db;
    private $get;

    public function __construct($db = null)
    {
        $this->db = new Database();
    }

    private function get($information = 0, $userid = null)
    {
        if ($userid === null) 
        {
            //if ($this->isOnline()) {
                $token = $_COOKIE['session'];

                $req = $this->db->query('SELECT user_id FROM cms_sessions WHERE token = :token',
                array(
                "token" => $token
                ));

                $userid = $req[0]['user_id'];
            //}
        }

        $req = $this->db->query('SELECT '. $information .' FROM users INNER JOIN users_info ON users.id = users_info.user_id WHERE users.id = :userid',
        array(
        "userid" => $userid
        ));

        return (count($req) > 0) ? htmlspecialchars($req[0][$information]) : "Erreur";
    }

    public function getId() 
    {
        $req = $this->db->query('SELECT user_id FROM cms_sessions WHERE token = :token',
        array(
        "token" => @$_COOKIE['session']
        ));

        return (count($req) > 0) ? intval($req[0]['user_id']) : "0";
    }

    public function getIP() 
    {
        return $this->get('last_ip');
    }


    public function getGender() 
    {
        return $this->get('gender');
    }

}

但是一旦我尝试检索用户信息,这给了我“0”谢谢您的回复!亲切地

标签: php

解决方案


欢迎来到堆栈溢出!

“改进”是一个非常主观的话题。如果我正确理解您的代码,那么我个人会稍微解耦逻辑。在您的具体情况下,我将使用一个存储库来访问数据库并返回一个模型,它将拥有您的公共吸气剂。

class User
{

    private $attributes = [];

    public function __construct(array $attributes)
    {
        $this->attributes = $attributes;
    }

    public function getId()
    {
        return $this->attributes['id'];
    }


    public function getIP() 
    {
        return $this->attributes['last_ip'];
    }


    public function getGender() 
    {
        return $this->attributes['gender'];
    }

}
class UserRepository
{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function getById($id)
    {
        $result = $this->db->query('SELECT * FROM ... WHERE userid = :userid', ['userid' => $id]);
        return new User($result);
    }

    public function getByToken($token)
    {
        $result = $this->db->query('SELECT * FROM ... WHERE token = :token', ['token' => $token]);
        return new User($result);
    }
}

最后你可以像这样使用它:

$repository = new UserRepository(new Database());

if (!empty($_COOKIE['session'])) {
    $user = $repository->getByToken($_COOKIE['session']);

} else if ($userid > 0) {
    $user = $repository->getById($userid);

} else {
  // Pseudo exit here. You should handle this accordingly.
  exit('User does not exist / not logged in');
}

echo $user->getId(); 
echo $user->getIP();
echo $user->getGender();

推荐阅读