fetchAll与PDO :: FetchClass返回相同的对象

时间:2014-01-16 16:12:38

标签: php mysql pdo

我正在做什么

我正在尝试使用以下内容获取Image对象数组:

(如果我运行原始MySQL查询,我会返回3个不同的行,所有行都有不同的值,显然除了product_id。)

$query = 'SELECT * FROM `j_images` WHERE product_id = :product_id';
$stmt = $db_conn->prepare($query);
if($stmt)
{
    $I = new \jenis\Product\Image();
    $stmt->setFetchMode(PDO::FETCH_INTO, $I);
    $result = $stmt->execute(array('product_id'=>$product_id));

    if($result)
    {
        $images = $stmt->fetchAll();
        var_dump($images);
    }
}

我得到什么

包含3个jenis\Product\Image个对象的数组,但对象(包括引用)是相同的。

我的期望

包含3个\jenis\Product\Image个对象的数组,每个对象都是唯一的。

这是因为它正在获取同一个对象(即$I)吗?如果是这样,有办法解决这个问题吗?

然而,PHP文档中的Example 4会让我相信这是可能的。

如果我直接从文档中跟随示例:

$images = $stmt->fetchAll(PDO::FETCH_CLASS, "\jenis\Product\Image");,我得到三个单独的对象,但所有属性都是NULL

其他信息

以下是我的Image Class的精简版:

namespace jenis\Product;

use jenis\DB as DB;
use \PDO as PDO;
class Image
{
    public $id;
    public $product_id;
    public $url;

    public static function getImagesByProduct($product_id)
    {
        … code outlined above … 
    }
}

上面列出的代码是作为静态方法执行的(例如Image::getImagesByProduct($product_id);

1 个答案:

答案 0 :(得分:1)

这不起作用的原因是因为我开发了构造函数以便可以传递可选参数。

例如:

function __construct($name='', $description='')
{
    $this->name = $name;
    $this->description=$description;
}

因为在调用FETCH_CLASS时使用构造函数,这导致我的变量为NULL,因为属性不作为参数传递。正如@Digital Chris所说,我需要PDO::FETCH_PROPS_LATE,它允许在调用构造函数之后设置属性。