默认情况下,以OBJ格式获取stdClass

时间:2018-07-11 13:01:05

标签: php fetch stdclass

与$ array ['value']相比,我更喜欢使用$ obj-> 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");
  }

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();

2 个答案:

答案 0 :(得分:1)

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

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

由于使用fetch会给下一个结果,因此只会得到一个结果;如果没有结果,则返回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
    }
    

请谨慎操作,因为它会使您的数据库连接打开。

  • FetchAll

    它一次返回数组中所有查询的结果。请注意,如果只有一个结果,则将有一个包含一个元素的数组。为此,您可以这样做:

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

如果您要创建一个User类的实例,也可以使用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
}

答案 1 :(得分:-1)

您可以在查询对象中使用setFetchMode,例如$query->setFetchMode(PDO::FETCH_OBJ);,然后仅使用$users = $query->fetch()String中的更多内容。