PHP Conference Japan 2024

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

从结果集中获取一行数据并将其作为对象返回,其中每个属性表示结果集列的名称。对该函数的每次后续调用都将返回结果集中的下一行,或者如果不再有行则返回null

如果结果的两个或多个列具有相同的名称,则最后一个列将优先并覆盖任何先前的数据。要访问具有相同名称的多个列,可以使用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

可选的array,用于传递给class对象的构造函数的参数。

返回值

返回一个表示已获取行的对象,其中每个属性表示结果集列的名称,如果结果集中不再有行,则返回null,或者在失败时返回false

错误/异常

constructor_args非空且类没有构造函数时,会抛出ValueError

变更日志

版本 描述
8.3.0 现在当constructor_args非空且类没有构造函数时,会抛出ValueError异常;以前会抛出Exception
8.0.0 constructor_args现在接受[]用于参数为 0 的构造函数;以前会抛出异常。

示例

示例 #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)

参见

添加注释

用户贡献的注释 5 个注释

25
Driek
12 年前
如 mysql_fetch_object 的用户评论中所述,务必了解类字段在调用构造函数之前就被分配了值。
例如:
<?php

class Employee
{
private
$id;

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

// 创建数据库连接的一些代码... 即 mysqli 对象
....
$result = $con->query("select id, name from employees");
$anEmployee = $result->fetch_object("Employee");
?>
将导致 ID 为 0,因为它被构造函数覆盖。因此,检查类字段是否已设置很有用。

<?php
class Employee
{
private
$id;

public function
__construct($id = 0)
{
if (!
$this->id)
{
$this->id = $id
}
}
}
?>
另请注意,将由 fetch_object 分配的字段区分大小写。如果您的表具有字段“ID”,则会导致设置类字段 $ID。一个简单的解决方法是使用别名。即“SELECT *, ID as id FROM myTable”
希望这对某些人有所帮助。
17
object-array at gmail dot com
8 年前
请注意 PHP>=5 中对象和数组之间的区别:数组按值传递,而对象按引用传递。

<?
$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']; // (数据库中的原始值)
?>

如果需要相同的行为,则需要克隆对象

<?
$o1 = clone $o;
?>

更多关于对象克隆的信息
https://php.net/manual/en/language.oop5.cloning.php
15
neo22s at gmail dot com
8 年前
从 5.6.21 和 PHP 7.0.6 开始

mysqli_fetch_object() 在调用对象构造函数后设置对象的属性。而不是像以前版本那样在之前。

因此行为发生了变化。似乎是一个错误,但不确定是否是故意为之。

https://bugs.php.net/bug.php?id=72151
6
macole at paypal dot com
8 年前
请注意,如果您提供的类中定义了 __set() 魔术方法,则对于类中未定义的任何属性,都会调用该方法。例如

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

?>

产生以下输出

__set was called! Name = partner_type
9
benpptung at tacol dot biz
15 年前
我不知道为什么没有人谈论这个。
fetch_object 非常强大,因为您可以实例化一个具有您想要的方法的对象。

您可以尝试以下操作..

<?php
class PowerfulVO extends AbstractWhatEver {

public
$field1;
private
$field2; // 注意:private 可以

public function method(){
// 此类中的方法
}
}

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

注意:如果类中未定义该字段,则 fetch_object 将为您添加该字段作为 public。

该方法非常强大,尤其是在您想使用 VO 设计模式或与 Flex Remoting Object 的类映射功能时(当然,您需要有 ZendAMF 或 AMFPHP ..框架)

希望这有帮助并为您打开新的可能性
To Top