首页 > 解决方案 > 默认获取为 OBJ 时的 stdClass

问题描述

我更喜欢使用 $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)_...

谢谢。

编辑:我不拥有数据库类。我这样做: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 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();

标签: phpfetchstdclass

解决方案


StdClass 是 PHP 通用对象(如评论中所述)。

我也会尝试回答您在评论中提出的其他问题。

您只会得到一个结果,因为您正在使用fetchwhich 给出下一个结果,当没有任何结果时返回 false 。你有几个选择:

  • 屈服

    使用发电机。这意味着您“暂停”该方法,并且您必须像 Iterable 一样调用它。例如 :

    public function getUsers()
    {
      yield $this->conn->query('SELECT * FROM users')->fetch();
    }
    

    会像这样使用:

    foreach ($userManager->getUsers() as $user) {
        // $user is a row of your database
    }
    

小心这个,因为它可以让你的数据库连接打开。

  • 全取

    它在一个数组中一次返回查询的所有结果。请注意,如果您只有一个结果,您将拥有一个包含一个元素的数组。对于这个你会做:

     public function getUsers()
     {
         return $this->conn->query('SELECT * FROM users')->fetchAll();
     }
     //...
     $users = $userManager->getUsers();
     foreach ($users as $user) {
         // your code
     }
    

也不是说如果你想要一个你已经创建的 User 类的实例,你可以使用PDO::FETCH_CLASS. 您将在此处找到文档

希望能帮助到你 !

小编辑以防不太清楚,您可以将格式指定为 ::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
}

推荐阅读