mysqli_result::fetch_object
mysqli_fetch_object
(PHP 5, PHP 7, PHP 8)
mysqli_result::fetch_object -- mysqli_fetch_object — 結果セットの次の行を取得し、オブジェクトとして返す
説明
オブジェクト指向型
$class
= "stdClass", array $constructor_args
= []): object|null|false手続き型
$result
, string $class
= "stdClass", array $constructor_args
= []): object|null|false
結果セットから1行取得し、それをオブジェクトとして返します。
このオブジェクトは、結果セットのカラム名をプロパティとして持ちます。
値を取得した後は、この関数をコールするたびに結果セットの次の行の値を返します。
もう結果セットに行がない場合には null
を返します。
もし2つ以上のカラムが同じ名前であった場合は、最後に現れた カラムが優先され、以前のあらゆるデータを上書きします。同名の複数のカラムに アクセスする場合、mysqli_fetch_row() を用いて 数値添字配列を使用するか、あるいは SQL クエリ中の SELECT リストに異なる名前を与えるために、カラムにエイリアスを指定する 必要があります。
注意: この関数がオブジェクトのプロパティを設定するのは、 オブジェクトのコンストラクタをコールする前であることに注意しましょう。
注意: この関数により返されるフィー ルド名は 大文字小文字を区別 します。
注意: この関数は、 NULL フィールドに PHPの
null
値を設定します。
パラメータ
result
-
手続き型のみ: mysqli_query()、mysqli_store_result()、mysqli_use_result()、mysqli_stmt_get_result() が返す mysqli_result オブジェクト。
class
-
インスタンス化してプロパティを設定後に返すクラスの名前。 省略した場合は stdClass オブジェクトを返します。
constructor_args
-
オプションのパラメータの配列で、
class
オブジェクトのコンストラクタに渡します。
戻り値
取得した行を表すオブジェクトを返します。
これは、個別のプロパティが結果セットのカラム名を表します。
結果セットにもう行がない場合には null
を返します。
失敗した場合に false
を返します
エラー / 例外
constructor_args
が空でないのに、
そのクラスがコンストラクタを持たない場合、
ValueError がスローされます。
変更履歴
バージョン | 説明 |
---|---|
8.3.0 |
constructor_args が空でないのに、
そのクラスがコンストラクタを持たない場合、
ValueError がスローされるようになりました。
これより前のバージョンでは、
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() - 結果の任意の行にポインタを移動する
User Contributed Notes 5 notes
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.
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
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
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
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