【问题标题】:stdClass when fetch as OBJ by default默认获取为 OBJ 时的 stdClass
【发布时间】: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 它一直在发生。我有一个例程来避免这种错误(尤其是在更大的算法中)。我与看护人交谈,并以他能理解的方式非常准确地向他解释我在做什么。它确实有助于更清楚地了解您的目标、您的问题以及如何解决它。当您逐行解释时,您会意识到您所说的没有意义或与书面内容不符。不要忘记将您的问题标记为已解决

标签: php fetch stdclass


【解决方案1】:

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

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

您只得到一个结果,因为您使用的是fetch,它给出了下一个结果,当没有任何结果时为假。你有几个选择:

  • 产量

    使用生成器。这意味着您“暂停”该方法,并且您必须像 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
     }
    

如果你想要一个你已经创建的用户类的实例,你也可以使用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
}

【讨论】:

  • 将获取方法更改为FETCH_ASSOC 不是答案,当stdClass 存在时我们如何使用数据?
  • @a55 您可能遇到的问题与作者提出的问题不同。此外,FETCH_ASSOC 不是答案。如果你需要处理对象,你可以在这里找到你需要的一切php.net/manual/en/language.oop5.php
【解决方案2】:

您可以在查询对象中使用setFetchMode,例如$query->setFetchMode(PDO::FETCH_OBJ);,然后只需$users = $query->fetch()。更多内容请关注documentation

【讨论】:

  • 我想使用 fetch() 进行任何查询。我想 fetch 给我对象而不是数组。你是对的,但我必须对所有查询都这样做......
  • 看看这个answer
  • 这正是我所做的。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多