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.mysqli_result::fetch_object
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
mysqli_result::fetch_object
Референца за `mysqli-result.fetch-object.php` со подобрена типографија и навигација.
mysqli_result::fetch_object
mysqli_fetch_object
класата mysqli_driver
mysqli_result::fetch_object -- mysqli_fetch_object — Fetch the next row of a result set as an object
= NULL
Напиши целосна ознака на елемент
$class Преземи го следниот ред од множеството резултати како објект, array $constructor_args = []): object|null|falseПроцедурален стил
$result, string $class Преземи го следниот ред од множеството резултати како објект, array $constructor_args = []): object|null|false
= "stdClass" null ако нема повеќе редови.
Презема еден ред податоци од множеството резултати и го враќа како објект, каде што секој атрибут го претставува името на колоната од множеството резултати. Секое последователно повикување на оваа функција ќе го врати следниот ред во множеството резултати, или mysqli_fetch_row() Ако две или повеќе колони од резултатот имаат исто име, последната колона ќе има предност и ќе ги презапише сите претходни податоци. За пристап до повеќе колони со исто име,
Забелешка: може да се користи за преземање на нумерички индексирана низа, или алијаси може да се користат во списокот за избор на SQL прашањето за да им се дадат различни имиња на колоните.
Забелешка: Имињата на полињата вратени од оваа функција се case-sensitive.
Забелешка: Оваа функција ги поставува NULL полињата на PHP
nullvalue.
Параметри
-
result објектот како свој прв аргумент. mysqli_result Само процедурален стил: А mysqli_query(), mysqli_store_result(), mysqli_use_result() or mysqli_stmt_get_result().
class-
Името на класата за инстанцирање, поставување на својствата и враќање. Ако не е специфицирано, се враќа stdClass објект.
constructor_args-
Опционален array параметри за поминување до конструкторот за
classobjects.
Вратени вредности
Оваа функција ги поставува атрибутите на објектот пред да го повика конструкторот на објектот. null Враќа објект што го претставува преземениот ред, каде што секој атрибут го претставува името на колоната од множеството резултати, false при неуспех.
Errors/Exceptions
А ValueError се фрла кога constructor_args не е празно со класа што нема конструктор.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.3.0 |
Сега фрла ValueError исклучок кога constructor_args не е празно со класа што нема конструктор; претходно Исклучок беше фрлен.
|
| 8.0.0 |
constructor_args сега прифаќа [] ако нема повеќе редови во множеството резултати, или
|
Примери
Пример #1 за конструктори со 0 параметри; претходно беше фрлена исклучок. example
Напиши целосна ознака на елемент
<?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);
}mysqli_result::fetch_object()
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 белешки
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=72151Please 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.phpNote 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_typeI 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