【问题标题】:fetchAll with PDO::FetchClass returning same objectfetchAll 与 PDO::FetchClass 返回相同的对象
【发布时间】:2014-02-05 16:02:49
【问题描述】:

我在做什么

我正在尝试使用以下方法获取 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);

【问题讨论】:

  • 删除fetchAll 行,只删除var_dump($I);
  • @Digital Chris - 返回一个 Image 对象,其属性对应于第一条记录。
  • 如果您删除setFetchMode(),您会得到正确的结果吗?
  • @Digital Chris - 感谢您的帮助;是的,我得到了正确的结果,尽管它是 PDO::FETCH_BOTH 类型的数组。如果我想不通,我可能会走这条路。
  • 问题可能出在您的 Image 类上...在这里查看答案:stackoverflow.com/questions/5137051/pdo-php-fetch-class。 PDO 可能无法访问变量?

标签: php mysql pdo


【解决方案1】:

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

例如:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2013-04-21
    • 2014-05-01
    相关资源
    最近更新 更多