0

コンストラクター(PDO接続)に引数を渡しながら、複数の行をインスタンスにフェッチしようとしています。一度に1行をフェッチしてから構築することもできますが、1行のソリューションを探しています。

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

}
4

3 に答える 3

3

どうですか:

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

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

FETCH_INTOは既存のクラスにデータを追加するために使用されるため、この場合は使用FETCH_CLASSする方が理にかなっています。


補足:すでにPDOを使用しているので、プリペアドステートメントを利用することもできます。これにより、SQLインジェクションについて心配する必要がなくなるという利点があります。

コード内で変更されるのは次のとおりです。

$stmt = $conn->prepare("SELECT * FROM members WHERE Members_Email = :member_email");
$result = $stmt->execute(array(":member_email" => $emailAddress));
于 2013-01-06T19:54:54.153 に答える
0

コードでは、1つの行を1つのオブジェクトにフェッチしているだけです。

ループでフェッチし、配列に追加する必要があります。

while ($row = $result->fetch(PDO::FETCH_INTO, new Member($conn)) {
    $members[] = $row;
}
return $members;
于 2013-01-06T19:55:14.513 に答える
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がデータをオブジェクトに入れる前に、コンストラクターが呼び出されることを確認する方法です。

于 2013-01-06T19:57:12.127 に答える