第一次尝试PDO。
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
$stmt = $dbh->query("SELECT * FROM animals");
$stmt->setFetchMode(PDO::FETCH_INTO, new animals);
foreach($stmt as $animals)
{
echo $animals->name;
}
如果我跳过setFetchMode()
方法,则需要调用不需要的$animals["name"]
。
但是我不想为每次查询都调用setFetchMode()
。
是否可以设置默认的FetchMode?或使用其他方法使query()
返回具有一个全局设置的对象。
也许您可以尝试扩展PDO类以自动为您调用该函数...简而言之:
myPDO类扩展了PDO{函数animalQuery($ sql){$ result = parent :: query($ sql);$ result-> setFetchMode(PDO :: FETCH_INTO,新动物);返回$ result;}// //如果您有不同的类,则很有用//函数VegetableQuery($ sql)// {// $ result = parent :: query($ sql);// $ result-> setFetchMode(PDO :: FETCH_INTO,新蔬菜);//返回$ result;//}}$ dbh = new myPDO(“ mysql:host = $ hostname; dbname = animals”,$ username,$ password);$ stmt = $ dbh-> animalQuery(“ SELECT * FROM animals”);foreach($ stmt as $ animals){echo $ animals-> name;}
由于PDO需要知道要提取到的对象,因此需要手动指定。但是,您当中只是想使用对象而不是数组来检索数据,并且不在乎它是否不是动物对象,因此,当您在连接字符串之后设置属性时,默认情况下可以使用匿名对象,这可以在数据库中完成。包装的构造函数
$connection = new PDO($connection_string);
//PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names returned in your result set
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
然后所有查询将返回对象。尽管它并不是您想要的完全关闭。
您也可以将数据注入动物类:
while($dataObj = ...) {
$animal = new Animal($dataObj);
}
如果您查看查询功能,可以通过传递额外的参数来更改某些选项:http://www.php.net/manual/en/pdo.query.php我尚未测试过,但看起来它使您接近所需的状态
您可以尝试这种方式:
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
$stmt = $dbh->query("SELECT * FROM animals");
$stmt->setFetchMode(PDO::FETCH_CLASS, animals::class);
foreach($stmt as $animals)
{
echo $animals->name;
}
我写了整篇关于fetching objects with PDO的文章。实际上,在大多数情况下,调用setFetchMode()
是多余的,可以避免。
是否可以设置默认的FetchMode?
嗯,这取决于。说到全局设置,有一个,但是显然您不能用它获取特定类的实例。如果您只关心语法,而只是想使用$animal->name
而不是$animal['name']
,则可以默认要求PDO创建stdClass()
的实例。为此,只需添加
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
到您的PDO connection options列表(链接是我写的另一个示例,我强烈建议您检出,因为与PDO的连接是一项复杂的业务,与示例中的任何一行都无关)。
设置了此选项,您可以立即使用对象语法:
$stmt = $dbh->query("SELECT * FROM animals");
foreach($stmt as $animal)
{
echo $animal->name;
}
[如果您需要获取特定的类,则对于对象列表,请使用您当前的方法setFetchMode()
/foreach
或者您可以将fetchAll()
与专用的PDO::FETCH_CLASS
提取模式一起使用:
$herd = $pdo->query('SELECT name FROM animals')->fetchAll(PDO::FETCH_CLASS, 'Animal');
这就是您所能拥有的,仅仅是因为您需要告诉PDO您将需要哪个特定类的实例。
还有其他选项,例如提供构造函数参数等。您可以在上面链接的文章中查看它们。