我试图在传递参数给构造函数(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();
}
}
怎么样:
$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));
在您的代码中,您只抓取一行到一个对象中。
需要在循环中取出,并添加到数组中:
while ($row = $result->fetch(PDO::FETCH_INTO, new Member($conn)) {
$members[] = $row;
}
return $members;
你的设计有缺陷。查询必须由存储库/实体管理器触发,如果您的应用程序非常小,则必须由控制器触发。
$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将数据放入对象