【发布时间】:2018-12-19 12:48:52
【问题描述】:
我更喜欢使用 $obj->value 而不是 $array['value'],所以我使用了
$database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
问题是当我做一个简单的请求时:
public function getUsers()
{
return $this->conn->query('SELECT * FROM users')->fetch();
}
它返回给我一个 stdClass,我无法获取用户列表。 (或者我不知道怎么做,但看起来很奇怪,我以前从未见过 stdClass)。
所以有了 FETCH_OBJ 属性,我得到了:
$list = $users->getUsers();
var_dump($list); // object(stdClass)#4 (6)[...]
没有 FETCH_OBJ 属性,我得到:(使用相同的代码)
array(12)[...]
我有 2 行 6 列,所以这一行给了我错误:(不是错误,但不是我想要的)
$database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
你知道为什么吗? 还有另一种方法可以将 FETCH_OBJ 设置为默认值吗?
我只想制作 fetch() 而不是 _fetch(PDO::FETCH_OBJ)_...
谢谢。
编辑:我不拥有数据库类。 我正在这样做: 数据库.php
try {
$database = new \PDO('mysql:host=localhost;dbname=projet', 'root', '');
$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
} catch(PDOExeption $e) {
die ("error mysql: $e");
}
UserManager 类:
class UserManager
{
private $conn;
public function __construct(\PDO $database)
{
$this->conn = $database;
}
public function getUsers()
{
return $this->conn->query('SELECT * FROM users')->fetch();
}
}
在我想使用 getUsers() 的任何文件中:
$users = new UserManager($database);
$list = $users->getUsers();
【问题讨论】:
-
"I never seen stdClass before"
stdClass是 PHP 的 generic 对象,如果你这样做了(object) array(),你会得到什么。在从查询返回对象的情况下,stdClass 会将列名作为属性;例如$obj->id -
好的,我明白了。为什么它只从我的用户表中返回一行?调用未定义的方法 stdClass::fetch()
-
@PierreDemailly 因为您在 getUsers 方法中使用了
PDO::fetch()。如果您想一次返回所有用户,请使用fetchAll()。您将拥有一个 StdClass 数组。如果您想拥有特定类的实例,请查看PDO::FETCH_CLASS。如果您想像while $row = $q->fetch()一样继续前进,也许您的方法应该返回该语句。您也可以“作弊”并使用yield而不是return,这样您就可以像foreach (getUsers() as $user) {...}一样使用它 -
@Zyigh 谢谢!我的坏我再次想知道为什么我使用 fetch() 并没有看到它 lmao
-
@PierreDemailly 它一直在发生。我有一个例程来避免这种错误(尤其是在更大的算法中)。我与看护人交谈,并以他能理解的方式非常准确地向他解释我在做什么。它确实有助于更清楚地了解您的目标、您的问题以及如何解决它。当您逐行解释时,您会意识到您所说的没有意义或与书面内容不符。不要忘记将您的问题标记为已解决