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