mysqli_result::fetch_object

mysqli_fetch_object

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_object -- mysqli_fetch_object結果セットの次の行を取得し、オブジェクトとして返す

説明

オブジェクト指向型

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

手続き型

mysqli_fetch_object(mysqli_result $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)

参考

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 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
9 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
9 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
+add a note

AltStyle によって変換されたページ (->オリジナル) /