PHP PDO fetchObject() - 仅包含除id成员之外的默认值的对象

时间:2016-07-29 10:21:55

标签: php mysql pdo

我想从MySQL数据库中获取一个对象,该数据库有一个名为“Article”的表。 getLatestArticle()函数如下:

public function getLatestArticle($priority){
    $query = "select * from article where priority = :priority having date = max(date);";
    $STH = $this->dbLink->prepare($query);
    $STH->bindParam(':priority', $priority);

    if(!$STH->execute()){
        print_r($STH->errorInfo());
    }else{
        return $STH->fetchObject('Article');
    }
}

正确地包含类,并且在mysql中具有类变量,构造函数参数和列名的名称会产生这样的结果:

object(Article)#6 (8) { ["id":"Article":private]=> string(2) "13" ["title":"Article":private]=> string(0) "" ["subTitle":"Article":private]=> string(0) "" ["imgFilePath":"Article":private]=> string(0) "" ["contentFilePath":"Article":private]=> string(0) "" ["author":"Article":private]=> string(0) "" ["date":"Article":private]=> string(0) "" ["priority":"Article":private]=> string(0) "" }

我按预期获得了类文章的对象,尽管只有字段“id”是正确的而其他所有字符都使用默认值。 我尝试使用setFetchMode(PDO :: FETCH_OBJ,'Article')并使用fetch(),也尝试使用setFetchMode(PDO :: FETCH_CLASS,'Article)并使用fetch()而没有任何运气。 Article中的所有类变量都指定为private,构造函数的表示方式如下:

public function __construct($title="", $subTitle="", $imgFilePath="", $contentFilePath="", $author="", $date="", $priority = ""){
    $this->title = $title;
    $this->subTitle = $subTitle;
    $this->imgFilePath = $imgFilePath;
    $this->contentFilePath = $contentFilePath;
    $this->author = $author;
    $this->date = $date;
    $this->priority = $priority;
}

我尝试删除构造函数中的默认值并将类成员从private更改为public,从而产生缺少的参数错误。

为什么通过fetchObject('Article')检索的对象最终只有id字段的值正确,而所有其他字段都使用默认值?

编辑:忘记提及,获取一个关联数组将正确填充所有字段,但我想用fetchObject()

1 个答案:

答案 0 :(得分:0)

我将跳过问题1,因为你从问题2开始,一个问题就足够了。你没有显示所涉及的所有代码,所以我必须猜测。

我在PHP手册中注意到它说:“当获取一个对象时,它的属性是从各自的列值中分配的,然后调用它的构造函数。”。所以当你的构造函数是:

class Article
{
  public function __construct($title="", $subTitle="", $imgFilePath="",
                              $contentFilePath="", $author="", 
                              $date="", $priority = "") {
    $this->title = $title;
    $this->subTitle = $subTitle;
    $this->imgFilePath = $imgFilePath;
    $this->contentFilePath = $contentFilePath;
    $this->author = $author;
    $this->date = $date;
    $this->priority = $priority;
  }
}

构造函数将覆盖用PDOStatement::fetchObject检索的列值。

要正确使用它:

class Article
{
  private $title = '';
  private $subTitle = '';
  private $imgFilePath = '';
  private $contentFilePath = '';
  private $author = '';
  private $date = '';
  private $priority = '';

  public function __construct() {
    // do whatever you need, but do not overwrite the column values
  }
}

我希望这会有所帮助。如果必须设置“列值”,则可以在类中使用setter。