PostgreSQL 布林值 true 變成字串 "t"
PostgreSQL 布林值 false 變成字串 "f"
這會造成混淆,並導致程式碼重複。我不明白為什麼在擷取值時,類型沒有正確地輸入。我們至少可以有一個可選參數來啟用此功能。
(PHP 4, PHP 5, PHP 7, PHP 8)
pg_fetch_object — 將資料列擷取為物件
$result
,$row
= null
,$class
= "stdClass",$constructor_args
= []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);
?>
PostgreSQL 布林值 true 變成字串 "t"
PostgreSQL 布林值 false 變成字串 "f"
這會造成混淆,並導致程式碼重複。我不明白為什麼在擷取值時,類型沒有正確地輸入。我們至少可以有一個可選參數來啟用此功能。
如果您想要將物件用於結果,但由於似乎無法將函式套用至結果的每個欄位(例如 stripslashes),而感到沮喪,請嘗試此程式碼
<?php
// 連線、執行查詢等等的程式碼...
$row = pg_fetch_object($result);
$vars = get_object_vars($row);
foreach ( $vars as $key => $var )
{
$row->{$key} = stripslashes($var);
}
?>
我注意到許多人使用 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 子句來執行個別檢查,以判斷是否沒有傳回任何內容。
我喜歡這個方法,因為它不使用任何暫時計數器變數。
由於「result_type 是可選的...」這段文字是直接從 pg_fetch_array 複製過來的,因此 result_type 參數不是無效就是文件撰寫不正確。此外,PGSQL_NUM 選項與前一段的「您只能透過欄位名稱存取資料,不能使用索引」互相衝突。
偏移量。」
當您檢索「timestamp with timezone」欄位的內容時,這會設定環境的時區變數。因此,這是很危險的
$s=$row->mydatefield;
$unixtimestamp=postgresqltimestamp2unix($s);
echo date("Y-m-d H:i:s",$unixtimestamp);
這裡,postgresqltimestamp2unix 是一個將 PostgreSQL 時間戳記轉換為 Unix 時間戳記的函數。範例中第一行檢索欄位資料的動作會影響第三行 `date()` 函數中使用的時區。
這不是很有用。如果您執行類似 foreach($row as $field) 的操作,您仍然會取得每個值兩次!
不過,您可以這樣做
foreach ($line as $key => $cell){
if (! is_numeric($key)){
echo "<td>$key $cell</td>";
}
}
is_numeric 的嚴格程度足夠嗎?
將資料庫結果當作物件取得。
<?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));
?>
我學到的一些用法
$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");
}