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(字串 $class = "stdClass", 陣列 $constructor_args = []): 物件|空值|假

程序式風格

mysqli_fetch_object(mysqli_result $result, 字串 $class = "stdClass", 陣列 $constructor_args = []): 物件|空值|假

從結果集中擷取一列資料,並將其作為一個物件返回,其中每個屬性代表結果集的欄位名稱。每次後續呼叫此函式都會返回結果集中的下一列,如果沒有更多列,則返回 空值

如果結果的兩個或多個欄位具有相同的名稱,則最後一個欄位將優先並覆蓋任何先前的資料。要存取具有相同名稱的多個欄位,可以使用 mysqli_fetch_row() 來擷取數值索引的陣列,或者可以在 SQL 查詢的選擇列表中使用別名來賦予欄位不同的名稱。

注意此函式會在呼叫物件建構函式 *之前* 設定物件的屬性。

注意此函式返回的欄位名稱 *區分大小寫*。

注意此函式將 NULL 欄位設定為 PHP 的 空值

參數

result

僅限程序式風格:由 mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() 返回的 mysqli_result 物件。

class

要實例化、設定其屬性並返回的類別名稱。如果未指定,則返回 stdClass 物件。

constructor_args

一個可選的 陣列 參數,用於傳遞給 class 物件的建構函式。

返回值

返回一個表示擷取列的物件,其中每個屬性代表結果集的欄位名稱;如果結果集中沒有更多列,則返回 空值;如果失敗,則返回

錯誤/例外

當 `constructor_args` 非空,但類別沒有建構子時,會拋出 ValueError

更新日誌

版本 說明
8.3.0 現在,當 `constructor_args` 非空,但類別沒有建構子時,會拋出 ValueError 例外;先前會拋出 Exception
8.0.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)

另請參閱

新增註解

使用者貢獻的註解 5 則註解

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"
希望這能幫助到一些人。
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.dev.org.tw/manual/en/language.oop5.cloning.php
neo22s at gmail dot com
8 年前
從 5.6.21 和 PHP 7.0.6 開始

mysqli_fetch_object() 在呼叫物件建構子「之後」設定物件的屬性,而不是像先前版本一樣在「之前」。

所以行為已經改變了。看起來像是一個 bug,但不確定是否是故意這樣做的。

https://bugs.php.net/bug.php?id=72151
macole at paypal dot com
8 年前
請注意,如果您提供的類別中定義了 __set() 魔術方法,則對於類別中未定義的任何屬性,都會呼叫該方法。例如

<?php

類別 SomeClass {
私有
$id;
公開
$partner_name;
公開 函式
__set( $name, $value ) {
顯示
"__set 已被呼叫!名稱 = $name\n";
$this->$name = $value;
}
}

$db = new mysqli( 'localhost', '使用者名稱', '密碼', '資料庫名稱' );
$result = $db->query( 'SELECT id, partner_name, partner_type FROM submissions' );
$object = $result->fetch_object( 'SomeClass' );

?>

產生以下輸出:

__set 已被呼叫!名稱 = partner_type
benpptung at tacol dot biz
15 年前
我不知道為什麼沒有人討論這個。
fetch_object 非常強大,因為您可以實例化一個具有您想要方法的物件。

您可以這樣試試看..

<?php
類別 PowerfulVO 繼承 AbstractWhatEver {

公開
$field1;
私有
$field2; // 注意:私有屬性也可以

公開 函式 method(){
// 這個類別中的方法
}
}

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

注意:如果欄位未在類別中定義,fetch_object 會將此欄位以公開屬性方式加入。

這個方法非常強大,尤其是在您想要使用 VO 設計模式或類別映射功能與 Flex Remoting Object 時(當然,您需要 ZendAMF 或 AMFPHP ..框架)

希望這能幫助您並開啟新的可能性
To Top