2013-01-06 74 views
0

我試圖在向構造函數(PDO連接)傳遞參數時將多行讀取到實例中。我可以一次獲取一行,然後構建它們,但我正在尋找一種解決方案。將參數傳遞給構造函數(PDO)時獲取多個對象

class Member { 

     // PDO connection 
     public $conn; 

     public $Members_ID; 
     public $Members_FirstName; 
     public $Members_LastName; 


     function __construct($conn){   
      $this->conn= $conn; 
     } 


     // Returns an array of Members with the email address that is given 
     // (Multiple members can have the same email) 
     public static function getMembersFromEmailAddress($emailAddress, $conn){ 

      try 
      { 
       $result = $conn->query("SELECT * FROM members WHERE Members_Email ='". $emailAddress ."'"); 

       //HERE I WANT MEMBERS TO BE AN ARRAY OF MEMBER OBJECTS 
       $members = $result->fetch(PDO::FETCH_INTO, new Member($conn)); 
       return $members 
      } 
      catch(PDOException $e) 
      { 
       echo $e->getMessage(); 
      } 

} 
+0

爲什麼會這樣不正確? – artragis

回答

3

關於什麼:

$args= array(); 
$args[] = $conn; 

$members = $result->fetchAll(PDO::FETCH_CLASS, 'Member', $args); 

FETCH_INTO用於將數據添加到現有的類,所以在使用的情況下FETCH_CLASS更有意義。


備註:由於您已經在使用PDO,因此您可以利用prepared statements。這提供了無需擔心SQL注入的好處。

在你的代碼的唯一的事,將改變爲:

$stmt = $conn->prepare("SELECT * FROM members WHERE Members_Email = :member_email"); 
$result = $stmt->execute(array(":member_email" => $emailAddress)); 
+1

這是正確答案,不是我的。做得好。 –

+0

'如果將字符集設置爲'UTF8'並禁用了準備模擬,則不必擔心。否則,這只是錯誤 – Yang

0

在你的代碼,你只取一行,到一個對象。

你需要在一個循環中獲取,並添加到一個數組:

while ($row = $result->fetch(PDO::FETCH_INTO, new Member($conn)) { 
    $members[] = $row; 
} 
return $members; 
+0

你的代碼不是他所需要的。 FETC_CLASS在這裏是爲了他想要的目的。 – artragis

0

你有一個設計缺陷。 如果您使用的是真正小型的應用程序,則必須由存儲庫/實體管理器或控制器觸發查詢。

$conn是沒有辦法的Member的屬性。

我會給你的代碼,因爲它必須是如果它是在控制器:

try{ 
    $s = $connection->prepare('SELECT * FROM members WHERE Members_Email=:mail'); 
    $s->execute(array('mail'=>$emailAddress)); 
    $result = $s->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,Member); 
} 

PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE聲明的是確保你的構造函數將被調用之前 PDO把你的DATAS方式進入對象

+0

除非你正在討論大規模的應用程序,用DataMapper對象,否則我認爲將$ conn傳遞給Member是沒有問題的。 –

+0

我不這麼認爲:SRP告訴我們會員沒有堅持自己的責任。我可以理解你不想創建一個無用的存儲庫,但是$ conn不會被聚集到成員表示中。 – artragis

+0

SRP在這一點上顯然超出了OP。請一次採取一步。 –

相關問題