2013-01-06 41 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。请一次采取一步。 –

相关问题