我想从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()答案 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。