mysqli_result::fetch_object

mysqli_fetch_object

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_object -- mysqli_fetch_objectВыбирает следующую строку из набора результатов в виде объекта

Описание

Объектно-ориентированный стиль

public function mysqli_result::fetch_object(string $class = "stdClass", array $constructor_args = []): object|null|false

Процедурный стиль

function mysqli_fetch_object(mysqli_result $result, string $class = "stdClass", array $constructor_args = []): object|null|false

Функция выбирает одну строку данных из набора результатов и возвращает её как объект, где каждое свойство представляет имя столбца набора результатов. Каждый последующий вызов функции будет возвращать следующую строку в наборе результатов или null, если строк больше нет.

Последний столбец будет иметь приоритет и перезапишет любые предыдущие данные, если у двух и более столбцов в наборе результатов одинаковое имя. Для доступа к нескольким столбцам с одинаковым именем либо вызывают функцию mysqli_fetch_row() для выбора массива с числовой индексацией, либо в списке выбора SQL-запроса указывают псевдонимы, чтобы задать столбцам разные имена.

Замечание: Функция устанавливает значения свойств объекта до вызова конструктора объекта.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result
Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().
class

Имя класса, объект которого нужно инстанцировать, задать значения его свойств и вернуть. Если параметр не задан, функция вернёт объект stdClass.

constructor_args

Необязательный массив (array) параметров, которые будут переданы конструктору класса class.

Возвращаемые значения

Функция возвращает объект, который представляет выбранную строку, в которой каждое свойство представляет имя столбца набора результатов, null, если в наборе результатов больше нет строк или false, если возникла ошибка.

Ошибки

Функция выбрасывает исключение ValueError, когда аргумент constructor_args не пуст, а класс class не имеет конструктора.

Список изменений

Версия Описание
8.3.0 Теперь функция выбрасывает исключение ValueError, когда аргумент constructor_args не пуст, а класс class не имеет конструктора. Ранее функция выбрасывала исключение Exception.
8.0.0 Параметр constructor_args теперь принимает пустой массив [] для конструкторов без параметров; раньше функция выбрасывала исключение.

Примеры

Пример #1 Пример использования метода mysqli_result::fetch_object()

Объектно-ориентированный стиль

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

while (
$obj = $result->fetch_object()) {
printf("%s (%s)\n", $obj->Name, $obj->CountryCode);
}

?>

Процедурный стиль

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($link, $query);

while (
$obj = mysqli_fetch_object($result)) {
printf("%s (%s)\n", $obj->Name, $obj->CountryCode);
}

?>

Результат выполнения приведённых примеров:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Смотрите также

  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку
Добавить

Примечания пользователей 5 notes

up
25
Driek
13 years ago
As indicated in the user comments of the mysql_fetch_object, it is important to realize that class fields get values assigned to them BEFORE the constructor is called.
For example;
<?php

class Employee
{
  private $id;

  public function __construct($id = 0)
  {
    $this->id = $id;
  }
}

// some code for creating a database connection... i.e. mysqli object
....
$result = $con->query("select id, name from employees");
$anEmployee = $result->fetch_object("Employee");
?>
will result in the ID being 0 because it is overridden by the constructor. Therefore, it is useful to check if the class field is already set.
I.e.
<?php
class Employee
{
  private $id;

  public function __construct($id = 0)
  {
    if (!$this->id)
    {
       $this->id = $id 
    }
  }
}
?>
Also note that the fields which will be assigned by fetch_object are case sensitive. If your table has the field "ID", it will result in the class field $ID being set. A simple work-around is to use aliases. I.e. "SELECT *, ID as id FROM myTable"
I hope this helps some people.
up
16
neo22s at gmail dot com
10 years ago
Since 5.6.21 and PHP 7.0.6

mysqli_fetch_object() sets the properties of the object AFTER calling the object constructor. Not BEFORE as was in previous versions.

So behaviour has changed. Seems a bug but not sure if was done intentionally.

https://bugs.php.net/bug.php?id=72151
up
15
object-array at gmail dot com
10 years ago
Please mind the difference between objects and arrays in PHP>=5: arrays are by value while objects are by reference.

<?
$o = mysqli_fetch_object($res);
$o1 = $o;
$o1->value = 10;

$a = mysqli_fetch_array($res);
$a1 = $a;
$a1['value'] = 10;

echo $o->value; // 10
echo $a['value']; // (original value from db)
?>

Should same behaviour be intended, the object needs to be cloned:

<?
$o1 = clone $o;
?>

More about object cloning:
http://php.net/manual/en/language.oop5.cloning.php
up
6
macole at paypal dot com
9 years ago
Note that if you supply a class that has a __set() magic method defined in it, that method will be called for any properties that are not defined in your class.  For example:

<?php

class SomeClass {
    private $id;
    public $partner_name;
    public function __set( $name, $value ) {
        echo "__set was called!  Name = $name\n";
        $this->$name = $value;
    }
}

$db = new mysqli( 'localhost', 'Username', 'Password', 'DbName' );
$result = $db->query( 'SELECT id, partner_name, partner_type FROM submissions' );
$object = $result->fetch_object( 'SomeClass' );

?>

Produces the following output:

__set was called!  Name = partner_type
up
9
benpptung at tacol dot biz
16 years ago
I don't know why no one talk about this.
fetch_object is very powerful since you can instantiate an Object which has the methods you wanna have.

You can try like this..

<?php
class PowerfulVO extends AbstractWhatEver {

    public $field1;
    private $field2; // note : private is ok

    public function method(){
       // method in this class
    }
}

     $sql = "SELECT * FROM table ..."
     $mysqli = new mysqli(........);
     $result = $mysqli->query($sql);
     $vo = $result->fetch_object('PowerfulVO');
?>

Note : if the field is not defined in the class, fetch_object will add this field for you as public.

The method is very powerful, especially if you want to use a VO design pattern or class mapping feature with Flex Remoting Object( Of course, you need to have ZendAMF or AMFPHP ..framework)

Hope this help and open new possibilities for you