PHP Conference Japan 2024

pg_fetch_object

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_object將資料列擷取為物件

說明

pg_fetch_object(
    PgSql\Result $result,
    ?int $row = null,
    string $class = "stdClass",
    array $constructor_args = []
): object|false

pg_fetch_object() 會傳回一個物件,其屬性對應到所擷取資料列的欄位名稱。它可以選擇性地實例化特定類別的物件,並將參數傳遞給該類別的建構函式。

注意此函式會將 NULL 欄位設為 PHP 的 null 值。

就速度而言,此函式與 pg_fetch_array() 相同,並且幾乎與 pg_fetch_row() 一樣快(差異很小)。

參數

result

pg_query()pg_query_params()pg_execute()(等等)傳回的 PgSql\Result 實例。

row

要擷取的結果中的資料列編號。資料列從 0 開始編號。如果省略或為 null,則會擷取下一資料列。

class

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

constructor_args

要傳遞給 class 物件建構函式的選用 array 參數。

傳回值

一個 object,其每個屬性對應到結果中的一個欄位名稱。資料庫 NULL 值會以 null 傳回。

如果 row 超過集合中的資料列數,或沒有其他資料列,或發生任何其他錯誤,則會傳回 false

錯誤/例外

constructor_args 為非空值且類別沒有建構函式時,會擲回 ValueError

變更日誌

版本 說明
8.3.0 constructor_args 為非空值且類別沒有建構函式時,現在會擲回 ValueError 例外;先前會擲回 Exception
8.1.0 result 參數現在預期 PgSql\Result 實例;先前預期 resource

範例

範例 #1 pg_fetch_object() 範例

<?php

$database
= "store";

$db_conn = pg_connect("host=localhost port=5432 dbname=$database");
if (!
$db_conn) {
echo
"連線到 postgres 資料庫 $database 失敗\n";
exit;
}

$qu = pg_query($db_conn, "SELECT * FROM books ORDER BY author");


while (
$data = pg_fetch_object($qu)) {
echo
$data->author . " (";
echo
$data->year . "): ";
echo
$data->title . "<br />";
}

pg_free_result($qu);
pg_close($db_conn);

?>

參閱

新增筆記

使用者提供的筆記 8 則筆記

10
ekevu at yahoo dot com
17 年前
PostgreSQL 布林值 true 變成字串 "t"
PostgreSQL 布林值 false 變成字串 "f"
這會造成混淆,並導致程式碼重複。我不明白為什麼在擷取值時,類型沒有正確地輸入。我們至少可以有一個可選參數來啟用此功能。
2
oracle dot shinoda at gmail dot com
20 年前
如果您想要將物件用於結果,但由於似乎無法將函式套用至結果的每個欄位(例如 stripslashes),而感到沮喪,請嘗試此程式碼

<?php
// 連線、執行查詢等等的程式碼...

$row = pg_fetch_object($result);
$vars = get_object_vars($row);
foreach (
$vars as $key => $var )
{
$row->{$key} = stripslashes($var);
}

?>
0
robeddielee at hotmail dot com
18 年前
我注意到許多人使用 FOR 迴圈來擷取查詢資料。這是我用來擷取資料的方法。

<?php
@$members = pg_query($db_conn, 'SELECT id,name FROM boards.members ORDER BY name;');
if (
$members AND pg_num_rows($members)) {
while (
$member = pg_fetch_object($members)) {
echo
$member->name.' ('.$member->id.')';
}
}
?>

如果在上述程式碼中發生錯誤(或沒有傳回任何內容),則不會輸出任何內容。可以在 IF 中新增 ELSE 子句來處理查詢錯誤(或沒有傳回任何內容)。或者,可以使用 ELSEIF 子句來執行個別檢查,以判斷是否沒有傳回任何內容。

我喜歡這個方法,因為它不使用任何暫時計數器變數。
-1
inbox at bucksvsbytes dot com
22 年前
由於「result_type 是可選的...」這段文字是直接從 pg_fetch_array 複製過來的,因此 result_type 參數不是無效就是文件撰寫不正確。此外,PGSQL_NUM 選項與前一段的「您只能透過欄位名稱存取資料,不能使用索引」互相衝突。
偏移量。」
-2
Lars at dybdahl dot dk
21 年前
當您檢索「timestamp with timezone」欄位的內容時,這會設定環境的時區變數。因此,這是很危險的

$s=$row->mydatefield;
$unixtimestamp=postgresqltimestamp2unix($s);
echo date("Y-m-d H:i:s",$unixtimestamp);

這裡,postgresqltimestamp2unix 是一個將 PostgreSQL 時間戳記轉換為 Unix 時間戳記的函數。範例中第一行檢索欄位資料的動作會影響第三行 `date()` 函數中使用的時區。
-2
ian at eiloart dot com
21 年前
這不是很有用。如果您執行類似 foreach($row as $field) 的操作,您仍然會取得每個值兩次!

不過,您可以這樣做

foreach ($line as $key => $cell){
if (! is_numeric($key)){
echo "<td>$key $cell</td>";
}
}

is_numeric 的嚴格程度足夠嗎?
-2
qeremy [atta] gmail [dotta] com
12 年前
將資料庫結果當作物件取得。

<?php
$qry
= pg_query("SELECT * FROM users");

$rows = array();
while (
$fch = pg_fetch_object($qry)) {
$rows[] = $fch;
}

// or

$rows = array_map(function($a){
return (object)
$a;
}, (array)
pg_fetch_all($qry));
?>
-4
michiel at minas-2 dot demon dot nl
20 年前
我學到的一些用法

$result=$pg_query (...);
$num = pg_numrows($result);

for($count=0;$count < $num && $data=pg_fetch_object($result,$count);$count++)
{
printf("<tr>\n");
printf(" <td>%s</td>\n",$data->foo);
printf(" <td>%s</td>\n",$data->bar);
printf("</tr>\n");
}
To Top