默认情况下作为 OBJ 获取时的 stdClass
stdClass when fetch as OBJ by default
我更喜欢使用 $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();
}
它 return 我是一个 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)_...
谢谢。
编辑:我没有数据库 class。
我这样做:
database.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");
}
用户管理器class:
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();
您可以在查询对象中使用 setFetchMode
,例如 $query->setFetchMode(PDO::FETCH_OBJ);
然后 $users = $query->fetch()
。更多内容在 documentation.
StdClass 是 PHP 通用对象(如评论中所述)。
我也会尽量回答您在评论中提出的其他问题。
您只得到一个结果,因为您使用的 fetch
会给出 下一个结果 ,当没有任何结果时为 false。您有几个选择:
产量
使用发电机。这意味着你 "pause" 方法,你必须像 Iterable 一样调用它。例如:
public function getUsers()
{
yield $this->conn->query('SELECT * FROM users')->fetch();
}
会像这样使用:
foreach ($userManager->getUsers() as $user) {
// $user is a row of your database
}
小心这个,因为它可以让你的数据库连接打开。
FetchAll
它returns 一次将您查询的所有结果放在一个数组中。请注意,如果您只有一个结果,您将得到一个只有一个元素的数组。对于这个你会做:
public function getUsers()
{
return $this->conn->query('SELECT * FROM users')->fetchAll();
}
//...
$users = $userManager->getUsers();
foreach ($users as $user) {
// your code
}
此外,如果您想要一个您创建的用户 class 的实例,您可以使用 PDO::FETCH_CLASS
。你会发现 documentation here.
希望对您有所帮助!
如果不太清楚,请稍作修改,您可以将格式指定为 ::fetch() 参数,例如 :
public function getUsers()
{
return $this->conn->query('SELECT * FROM users')->fetchAll(PDO::FETCH_ASSOC);
// will return results as associative array even if you specified FETCH_OBJ in your constructor
}
我更喜欢使用 $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();
}
它 return 我是一个 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)_...
谢谢。
编辑:我没有数据库 class。 我这样做: database.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");
}
用户管理器class:
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();
您可以在查询对象中使用 setFetchMode
,例如 $query->setFetchMode(PDO::FETCH_OBJ);
然后 $users = $query->fetch()
。更多内容在 documentation.
StdClass 是 PHP 通用对象(如评论中所述)。
我也会尽量回答您在评论中提出的其他问题。
您只得到一个结果,因为您使用的 fetch
会给出 下一个结果 ,当没有任何结果时为 false。您有几个选择:
产量
使用发电机。这意味着你 "pause" 方法,你必须像 Iterable 一样调用它。例如:
public function getUsers() { yield $this->conn->query('SELECT * FROM users')->fetch(); }
会像这样使用:
foreach ($userManager->getUsers() as $user) { // $user is a row of your database }
小心这个,因为它可以让你的数据库连接打开。
FetchAll
它returns 一次将您查询的所有结果放在一个数组中。请注意,如果您只有一个结果,您将得到一个只有一个元素的数组。对于这个你会做:
public function getUsers() { return $this->conn->query('SELECT * FROM users')->fetchAll(); } //... $users = $userManager->getUsers(); foreach ($users as $user) { // your code }
此外,如果您想要一个您创建的用户 class 的实例,您可以使用 PDO::FETCH_CLASS
。你会发现 documentation here.
希望对您有所帮助!
如果不太清楚,请稍作修改,您可以将格式指定为 ::fetch() 参数,例如 :
public function getUsers()
{
return $this->conn->query('SELECT * FROM users')->fetchAll(PDO::FETCH_ASSOC);
// will return results as associative array even if you specified FETCH_OBJ in your constructor
}