默认情况下以OBJ格式获取stdClass [英] stdClass when fetch as OBJ by default

查看:59
本文介绍了默认情况下以OBJ格式获取stdClass的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

与$ array ['value']相比,我更喜欢使用$ obj-> value,所以我使用了

I prefer use $obj->value than $array['value'], so i used

$database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

问题是当我做一个简单的要求时:

The problem is when i do a simple req :

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

它返回了一个stdClass,我无法获取用户列表. (或者我不知道如何,但是看起来很奇怪,我之前从未见过stdClass.)

It return me a stdClass and i can't get users list. (Or i don't know how, but it look weird, I never saw stdClass before).

因此,有了FETCH_OBJ属性,我得到了:

So with FETCH_OBJ attribute I've got:

$list = $users->getUsers();
var_dump($list); // object(stdClass)#4 (6)[...]

我没有FETCH_OBJ属性:(具有相同的代码)

Without FETCH_OBJ attribute I've got: (With same code)

array(12)[...]

我有2行6列,所以此行给我错误:(不是错误,但不是我想要的)

And I have 2 rows 6 cols so this line give me error: (not error, but not what I want)

$database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

你知道为什么吗? 还有另一种方法将FETCH_OBJ设置为默认值吗?

Do you know why ? Is there another way to set FETCH_OBJ as default ?

我只是想制作 fetch()而不是_fetch(PDO :: FETCH_OBJ)_...

I just wanna make fetch() instead _fetch(PDO::FETCH_OBJ)_...

谢谢.

我不拥有数据库类. 我是这样的: database.php

I don't own database class. I'm doing like this: 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类:

UserManager 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()的文件中:

And in any file i want to use getUsers():

$users = new UserManager($database);
$list = $users->getUsers();

推荐答案

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

StdClass is PHP generic object (as said in the comments).

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

I'll try to answer to other questions you ask in comments too.

由于使用fetch会给下一个结果,因此只会得到一个结果,如果没有结果,则返回false.您可以选择以下几种方法:

You're only getting one result because you are using fetch which give the next result, false when there isn't any result left. You have a few options for that :

  • 收益

  • Yield

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

Using a generator. It means that you "pause" the method, and you have to call it like an Iterable. For example :

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

将像这样使用:

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

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

Be carefull with this because it can let your database connection open.

  • FetchAll

  • FetchAll

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

It returns all the results of your query at once in an array. Note that if you have only one result, you will have an array of one element. For this one you would do :

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

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

Also not that if you want an instance of a User class you've made, you can use PDO::FETCH_CLASS. You will find the documentation here.

希望有帮助!

在不太清楚的情况下进行小的编辑,您可以将格式指定为:: fetch()参数,例如:

Small edit in case it's not quite clear, you can specify the format as ::fetch() argument such as :

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格式获取stdClass的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆