PDO :: FETCH_CLASS参数

时间:2016-03-22 17:47:31

标签: php mysql pdo

可以创建另一个实例作为PDO :: fetchAll()中当前实例的参数发送吗?

如果设置了\ PDO :: FETCH_PROPS_LATE,它将首先调用__construct并且SECONDLY设置属性。所以你通过数组传递给__construct的值将被覆盖。 但是,当它覆盖这些值时,它并不了解凭证实例。

更好地说明了 例如

<?php
class Voucher {
    private $CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS;
    public function __construct($CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS) {
        $this->CD_ID = $CD_ID;
        $this->CD_VOUCHER = $CD_VOUCHER;
        $this->NR_EXPIRATION = $NR_EXPIRATION;
        $this->DT_VOUCHER = $DT_VOUCHER;
        $this->IE_STATUS = $IE_STATUS;
    }
}
class Authentication {
    private $CD_AUTH, $DT_AUTH, Voucher $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG;
    public function __construct($CD_AUTH, $DT_AUTH, Voucher $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG) {
        $this->CD_AUTH = $CD_AUTH;
        $this->DT_AUTH = $DT_AUTH;
        $this->CD_VOUCHER = $CD_VOUCHER;
        $this->CD_IP = $CD_IP;
        $this->CD_MAC = $CD_MAC;
        $this->CD_LOG = $CD_LOG;
    }
}
public function getAuthentications() {
    try {
        $sth = $this->db->prepare("SELECT `TB_AUTENTICACAO`.`CD_AUTH`, `TB_AUTENTICACAO`.`DT_AUTH`, `TB_VOUCHER`.`CD_ID`, `TB_VOUCHER`.`CD_VOUCHER`, `TB_VOUCHER`.`NR_EXPIRATION`, `TB_VOUCHER`.`DT_VOUCHER`, `TB_VOUCHER`.`IE_STATUS`, `TB_AUTENTICACAO`.`CD_IP`, `TB_AUTENTICACAO`.`CD_MAC`, `TB_AUTENTICACAO`.`CD_LOG` FROM `TB_AUTENTICACAO` INNER JOIN `TB_VOUCHER` ON `TB_VOUCHER`.`CD_ID` = `TB_AUTENTICACAO`.`CD_VOUCHER`;");
        $sth->execute();
        return $sth->fetchAll(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, "Models\\Authentication", array("TB_AUTENTICACAO.CD_AUTH", "TB_AUTENTICACAO.DT_AUTH", new \Models\Voucher("TB_VOUCHER.CD_ID", "TB_VOUCHER.CD_VOUCHER", "TB_VOUCHER.NR_EXPIRATION", "TB_VOUCHER.DT_VOUCHER", "TB_VOUCHER.IE_STATUS"), "TB_AUTENTICACAO.CD_IP", "TB_AUTENTICACAO.CD_MAC", "TB_AUTENTICACAO.CD_LOG"));
        } catch (Exception $exc) {
        die($exc->getMessage());
    }
}

结果必须是:
e.g。

Models\Authentication Object (
    [CD_AUTH:Models\Authentication:private] => 2
    [DT_AUTH:Models\Authentication:private] => 2016-03-22 10:44:00
    [CD_VOUCHER:Models\Authentication:private] => Models\Voucher Object (
            [CD_ID:Models\Voucher:private] => 1
            [CD_VOUCHER:Models\Voucher:private] => xYgPB5
            [NR_EXPIRATION:Models\Voucher:private] => 720
            [DT_VOUCHER:Models\Voucher:private] => 2016-03-18 17:00:00
            [IE_STATUS:Models\Voucher:private] => 0
    )
    [CD_IP:Models\Authentication:private] => 10.10.10.10
    [CD_MAC:Models\Authentication:private] => abc
    [CD_LOG:Models\Authentication:private] => 1
)

但我明白了:
e.g。

Models\Authentication Object (
    [CD_AUTH:Models\Authentication:private] => 2
    [DT_AUTH:Models\Authentication:private] => 2016-03-22 10:44:00
    [CD_VOUCHER:Models\Authentication:private] => xYgPB5
    [CD_IP:Models\Authentication:private] => 10.10.10.10
    [CD_MAC:Models\Authentication:private] => abc
    [CD_LOG:Models\Authentication:private] => 1
    [CD_ID] => 1
    [NR_EXPIRATION] => 720
    [DT_VOUCHER] => 2016-03-18 17:00:00
    [IE_STATUS] => 0
)

1 个答案:

答案 0 :(得分:0)

我只是简单地将变量定义为类本身的类。但是,我不确定你为什么会遇到这个问题,也许是因为你没有将变量附加到新类?

如果您使用的是PHP 5.6+,则可以使用可变长度参数列表。 看到你的代码,我认为它会提高读取能力,但缺点是你需要确保将正确数量的变量解析到构造函数中。

class Authentication {
    private $CD_AUTH, $DT_AUTH, $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG;
    public function __construct($CD_AUTH, $DT_AUTH, array $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG) {
        ...
        $this->CD_VOUCHER = new \Models\Voucher(...$CD_VOUCHER);
        ...
        # or go anonymous in php 7
        $this->CD_VOUCHER = new class(...$CD_VOUCHER){
          function __construct($CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS){
            ...
          }
        }
    }
}

public function getAuthentications() {
    try {
        $sth = $this->db->prepare("...");
        $sth->execute();
        return $sth->fetchAll(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, "Models\\Authentication", array("TB_AUTENTICACAO.CD_AUTH", "TB_AUTENTICACAO.DT_AUTH", ["TB_VOUCHER.CD_ID", "TB_VOUCHER.CD_VOUCHER", "TB_VOUCHER.NR_EXPIRATION", "TB_VOUCHER.DT_VOUCHER", "TB_VOUCHER.IE_STATUS"], "TB_AUTENTICACAO.CD_IP", "TB_AUTENTICACAO.CD_MAC", "TB_AUTENTICACAO.CD_LOG"));
        } catch (Exception $exc) {
        die($exc->getMessage());
    }
}