2017-11-18 2 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つのフィールドをすべて選択して関連するデータを取得するためのクエリを1回実行する方法はありますか?

+1

通常、データベースのオブジェクトモデルを使用する場合は、1回のクエリで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))]; 
     } 
    } 

} 

を:

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

あなたは、その後も、必要に応じてセッションでモデルを保持します。

$_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

関連する問題