mysqli_result::fetch_object

mysqli_fetch_object

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_object -- mysqli_fetch_objectRecebe a próxima linha de um resultado como um objeto

Descrição

Estilo orientado a objetos

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

Estilo procedural

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

Recebe uma linha de dados do resultado e retorna-a como um objeto, onde cada propriedade representa o nome da coluna do resultado. Cada chamada subsequente a esta função retornará a linha seguinte dentro do conjunto de resultados, ou null se não houver mais linhas.

Se duas ou mais colunas do resultado tiverem o mesmo nome, a última coluna terá precedência e irá sobrescrever os dados anteriores. Para acessar múltiplas colunas com o mesmo nome, mysqli_fetch_row() pode ser usada para receber o array indexado numericamente, ou apelidos podem ser usados na lista de seleção da consulta SQL para dar nomes diferentes às colunas.

Nota: Esta função define as propriedades do objeto antes de chamar o construtor do objeto.

Nota: Os nomes de campos retornados por esta função diferenciam maiúsculas e minúsculas.

Nota: Esta função define campos NULL como o valor null do PHP.

Parâmetros

result
Somente no estilo procedural: Um objeto mysqli_result retornado por mysqli_query(), mysqli_store_result(), mysqli_use_result() ou mysqli_stmt_get_result().
class

O nome da classe a instanciar, definir propriedades e retornar. Se não especificada, um objeto stdClass é retornado.

constructor_args

Um array opcional de parâmetros para passar ao construtor de objetos da classe definida em class.

Valor Retornado

Retorna um objeto que representa a linha recebida, onde cada propriedade representa o nome da coluna do resultado, null se não houver mais colunas no resultado, ou false em caso de falha.

Erros/Exceções

Um exceção ValueError é lançada quando o parâmetro constructor_args é não vazio com a classe não possuindo construtor.

Registro de Alterações

Versão Descrição
8.3.0 Agora lança uma exceção ValueError quando o parâmetro constructor_args é não vazio com a classe não possuindo construtor; anteriormente uma Exception era lançada.
8.0.0 constructor_args agora aceita [] para construtores sem parâmetros; anteriormente, uma exceção era lançada.

Exemplos

Exemplo #1 Exemplo de mysqli_result::fetch_object()

Estilo orientado a objetos

<?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);
}

Estilo procedural

<?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);
}

Os exemplos acima produzirão algo semelhante a:

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

Veja Também

adicionar nota

Notas de Usuários 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