【问题标题】:PDO::FETCH_PROPS_LATE and __construct() call using fetched dataPDO::FETCH_PROPS_LATE 和 __construct() 调用使用获取的数据
【发布时间】:2013-01-15 11:27:06
【问题描述】:

这个问题与这里已经提出的问题非常相似:PDO using PDO::FETCH_PROPS_LATE and __construct() call?

但是,该问题中接受的答案并没有真正回答如何将 fetched 值传递到类的构造函数中(如果可能的话)。这是一些简化的代码:

<?php

class Course {
    private $name;
    private $code;
    private $prerequisites;

    public function __construct($name, $code) {

        if(!is_string($code) || mb_strlen($code) !== 7) {
            throw new \InvalidArgumentException('Invalid code.');
        }

        $this->name = $name;
        $this->code = $code;
        $this->prerequisites = array();
    }

    public static function getAllCourses() {
        $sql = 'SELECT `name`, `code` FROM `courses` ORDER BY `code`;';
        $db = new \PDO(' ... ', DB_USER, DB_PASS);

        $stmt = $db->query($sql);
        $stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'Course', array('name', 'code'));

        return $stmt->fetchAll();
    }
}
?>

这段代码的问题是文字字符串“name”和“code”被传递给构造函数。但是我想将名称和代码的实际值传递给构造函数(显然)。

这可以吗?如果是,如何?我用bindColumn()吗?

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    基本上,任何 PDO::fetch_something() 方法都会分配属性。

    所以你刚刚定义了与列同名的属性,因为你正确地拥有它。 你甚至不需要 getter 或 setter 或构造函数!

    您可以像这样将值传递给类的构造函数:

    $stmt->setFetchMode(\PDO::FETCH_CLASS,
        'Course',
        array(<value of col1>, <value of col2>));
    

    注意,您传递的不是列名,而是数组中的值!

    但这很棘手!请务必正确设置 fetchMode!

    如果设置了\PDO::FETCH_PROPS_LATE,它将首先调用__construct,然后设置属性。因此,您通过数组传递给 __construct 的值将被覆盖。

    如果你没有设置 \PDO::FETCH_PROPS_LATE 它会做相反的事情。

    试试吧。

    【讨论】:

    • 但问题是,如果你没有为你的构造函数传递一个数组,你必须为构造函数中的所有参数设置默认值,因为PDO会调用那个构造函数,而php会抛出一个错误,如果参数不匹配。 see this answer
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多