2017-11-18 53 views
0

我有我的用户类以下功能来获得用户ID,姓名和电子邮件:在PHP中扩展对方的功能更有效率?

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个字段,并有一个函数来获取相关数据?然后

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

你甚至:

+1

通常,当您从数据库中获取对象模型时,只需使用一个查询加载它一次,并将这些字段保留在内存中。 – apokryfos

回答

1

试试这个:

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

} 

然后,你可以这样做如果你想要在会议中坚持模型:

$_SESSION["usermodel"] = $user;  
1

您可能需要编写代码之前,多想想......

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; 
} 
+0

为了使这一点更好,我将第一次加载时将用户存储在类属性中。然后在对'getUserEmail()'和类似的任何调用中,检查用户是否已经加载,如果没有,加载它并返回电子邮件。如果不是,您仍然会在每次调用getUser()时加载用户。 –

+0

但是,我将如何访问只是用户名,例如? ' getUser() - > $ UserNameAttribute; ?>'? – Jordan1992