在 PHP 中相互扩展以提高效率的函数



我的用户类中有以下函数来获取用户ID,名称和电子邮件:

public function getUserID(){
    $stmt = $this->conn->prepare("SELECT userID FROM [DataBase].[dbo].[users] WHERE userID=:uid");
    $stmt->execute(array(":uid"=>$_SESSION['userSession']));
    $userID=$stmt->fetch(PDO::FETCH_ASSOC);
    echo $userID['userID'];
}
public function getUserName(){
    $stmt = $this->conn->prepare("SELECT userName FROM [DataBase].[dbo].[users] WHERE userID=:uid");
    $stmt->execute(array(":uid"=>$_SESSION['userSession']));
    $userName=$stmt->fetch(PDO::FETCH_ASSOC);
    echo $userName['userName'];
}
public function getUserEmail(){
    $stmt = $this->conn->prepare("SELECT userEmail FROM [DataBase].[dbo].[users] WHERE userID=:uid");
    $stmt->execute(array(":uid"=>$_SESSION['userSession']));
    $userEmail=$stmt->fetch(PDO::FETCH_ASSOC);
    echo $userEmail['userEmail'];
}

但我只是觉得会有更好的方法来做到这一点,因为执行 3 个几乎相同的查询似乎浪费了资源。

有没有办法我可以执行一次查询以选择所有 3 个字段并具有仅获取相关数据的功能?

试试这个:

class User {
    private $user;
    public function __construct($id, $conn) {
            $stmt = $conn->prepare("SELECT * FROM [DataBase].[dbo].[users] WHERE userID=:uid");
            $stmt->execute(array(":uid"=>$id));
            $this->user = $stmt->fetch(PDO::FETCH_ASSOC);
    }
    public function getUserId() {
           return $this->user["userID"];
    }
    // more methods as well or a generic __call e.g.
    public function __call($name, $args) {
         if (substr($name, 0, 3) === "get") { // e.g. getUserName will get userName
             return $this->user[lcfirst(substr($name,3))];
         }
    }
}

然后你可以做:

 $user = new User($_SESSION["userSession"], $this->conn);

然后,如果需要,甚至可以在会话中保留模型:

 $_SESSION["usermodel"] = $user;       

在编写代码之前,您可能需要考虑更多...

public function getUser(){
    $stmt = $this->conn->prepare("SELECT * FROM [DataBase].[dbo].[users] WHERE userID=:uid");
    $stmt->execute(array(":uid"=>$_SESSION['userSession']));
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    // get attributes : $user['userName'] ....
    return $user;
}

最新更新