PHP Conference Japan 2024

pg_fetch_array

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

pg_fetch_array以陣列形式擷取一列

說明

pg_fetch_array(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false

pg_fetch_array() 返回一個對應於擷取的列(記錄)的陣列。

pg_fetch_array()pg_fetch_row() 的擴充版本。除了將資料儲存在結果陣列的數值索引(欄位編號)之外,它還可以使用關聯索引(欄位名稱)儲存資料。預設情況下,它會儲存兩種索引。

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

pg_fetch_array() 並不比使用 pg_fetch_row() 慢很多,而且使用起來更容易。

參數

result

一個 PgSql\Result 實例,由 pg_query()pg_query_params()pg_execute()(以及其他函式)返回。

row

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

mode

一個可選參數,控制傳回的 array 如何索引。mode 是一個常數,可以採用下列值:PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。使用 PGSQL_NUM,函式將傳回具有數值索引的陣列,使用 PGSQL_ASSOC,它將只傳回關聯索引,而 PGSQL_BOTH 將傳回數值索引和關聯索引。

傳回值

一個以數值(從 0 開始)或關聯方式(以欄位名稱索引)索引的 array,或兩者皆有。 array 中的每個值都以 string 表示。資料庫的 NULL 值會以 null 傳回。

如果 row 超過集合中的列數、沒有更多列,或發生任何其他錯誤,則會傳回 false。從 SELECT 以外的查詢結果擷取也會傳回 false

變更記錄

版本 說明
8.1.0 result 參數現在預期一個 PgSql\Result 實例;之前,預期的是 resource

範例

範例 1 pg_fetch_array() 範例

<?php

$conn
= pg_pconnect("dbname=publisher");
if (!
$conn) {
echo
"發生錯誤。\n";
exit;
}

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!
$result) {
echo
"發生錯誤。\n";
exit;
}

$arr = pg_fetch_array($result, 0, PGSQL_NUM);
echo
$arr[0] . " <- 第 1 列作者\n";
echo
$arr[1] . " <- 第 1 列電子郵件\n";

// row 參數是可選的;可以傳遞 NULL 來代替,
// 以傳遞 result_type。連續呼叫 pg_fetch_array
// 會返回下一列。
$arr = pg_fetch_array($result, NULL, PGSQL_ASSOC);
echo
$arr["author"] . " <- 第 2 列作者\n";
echo
$arr["email"] . " <- 第 2 列電子郵件\n";

$arr = pg_fetch_array($result);
echo
$arr["author"] . " <- 第 3 列作者\n";
echo
$arr[1] . " <- 第 3 列電子郵件\n";

?>

參見

新增註解

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

3
mkb at ele dot uri dot edu
23 年前
如果您使用 PGSQL_ASSOC 或 PGSQL_BOTH,則欄位名稱永遠為小寫,無論資料庫或查詢中的名稱是什麼。
3
jesse at sokieserv dot dhs dot org
22 年前
從 PHP 4.1.0 開始,您現在可以使用如下程式碼來逐一查看結果集

$conn = pg_connect("host=localhost dbname=whatever");
$result = pg_exec($conn, "select * from table");
while ($row = pg_fetch_array($result))
{
echo "data: ".$row["data"];
}

這可以是一個不錯的省時小工具,PHP搭配MySQL早已支援這種功能,很高興看到它擴展到PostgreSQL...
2
gherson at snet dot net
23 年前
PGSQL_BOTH 是預設值,這表示你的陣列大小會加倍。
如果你指定這個欄位(結果類型),請不要在它周圍加上引號,否則你不會得到任何資料,甚至連錯誤訊息也不會。
這是我的包裝函式
function SQL_fetch_array($result_ndx, $row, $result_type=PGSQL_ASSOC) {
return pg_fetch_array($result_ndx, $row, $result_type);
1
gherson at snet dot net
23 年前
除了在「沒有更多列」時返回 "false" 之外,pg_fetch_array 也會觸發 E_WARNING。你可以暫時關閉該錯誤報告等級,並像這樣取出所有資料

<?php
$errRptLvl
= error_reporting();
error_reporting($errRptLvl & ~(E_WARNING));

list(
$i,$j)=array(0,0);
while (
$selection[$i++] = $this->fetchArray($j++)); // (fetchArray 是一個 pg_fetch_array 的包裝函式。)
error_reporting($errRptLvl); // 還原錯誤報告等級。
unset($selection[$i-1]); // 刪除最後一個空的列。
return $selection;
?>
1
strata_ranger at hotmail dot com
15 年前
請注意,當使用 PGSQL_BOTH 時,以數字和關聯方式索引的欄位是獨立的變數,並被視為獨立的變數處理

<?php
$res
= pg_query("Select 'foo' as bar");

$data = pg_fetch_array($res, 0, PGSQL_BOTH);

var_dump($data);
// Array(2)
// {
// [0] => string(3) "foo"
// ["bar"] => string(3) "foo"
// }

// 這不會影響 $data['bar']
$data[0] = 'bar';

var_dump($data);
// Array(2)
// {
// [0] => string(3) "bar"
// ["bar"] => string(3) "foo"
// }
?>

如果你想要在數字索引和關聯索引之間建立參考綁定,你必須自己建立

<?php

$result
= pg_query("Select 'foo' as bar");

$data = pg_fetch_row($result);

// 建立欄位名稱/編號之間的參考
$from = $data;
foreach(
$from as $cx => $value)
{
$key = pg_field_name($result, $cx);
if (
is_string($key)) $data[$key] =& $data[$cx];
}

var_dump($data);
// Array(2)
// {
// [0] => &string(3) "foo"
// ["bar"] => &string(3) "foo"
// }
// 注意 $data[0] 和 $data['bar'] 之間的參考綁定

$data[0] = 'baz';

var_dump($data);
// Array(2)
// {
// [0] => &string(3) "baz"
// ["bar"] => &string(3) "baz"
// }

?>
1
akm at e-nterart dot pl
21 年前
(省時提示)請注意,此函式返回的陣列中的鍵(至少在 4.2.3 版中)與 SQL 欄位名稱的大小寫相同(例如,如果你的欄位名稱是 ID,那麼鍵名稱也是 ID,而不是 id 或 Id),而且關聯陣列中的鍵是區分大小寫的!!! 所以如果得到非預期的結果,請不要感到驚訝。仔細檢查 SQL 欄位名稱和鍵名稱。
0
devnull
19 年前
針對下方 eth0 關於從兩個資料表 SELECT 資料,而資料表有相同名稱欄位的評論,你可以這樣解決這個問題

"SELECT table1.foo AS foo1, table2.foo AS foo2 FROM table1, table2"

在返回的關聯陣列中,鍵將會是 "foo1" 和 "foo2"。
-1
anonymous
19 年前
希望大多數人都能自己意識到這一點,但下面人們嘗試在結果中取得數值或關聯(而非兩者)鍵的做法,其實是毫無意義的。請參閱 pg_fetch_assoc() 和 pg_fetch_row(),它們是內建函式,可以自動執行此操作。通常,最好使用這些其他函式之一,除非你 *需要* 同時透過欄位名稱 *和* 索引存取欄位。
-1
enyo at www.red-link.com
21 年前
因為指定結果類型的方式不太清楚,所以我發佈這則訊息。

我寫了一個看起來像這樣的包裝函式

<?php
function db_fetch_array ($result, $row = NULL, $result_type = PGSQL_ASSOC)
{
$return = @pg_fetch_array ($result, $row, $result_type);
return
$return;
}
?>

我認為這樣做可以很方便地取得你想要的陣列。
-2
eth0 at fins
23 年前
請記住,如果你有例如一個 Customers 資料表,其中包含 "cust_ID"、"name" 和 "address",以及另一個 Users 資料表,其中包含 "u_ID"、"name" 和 "other",然後你執行 SELECT WHERE cust_ID=u_ID,那麼你在結果陣列中只會得到一個 "name" 欄位,確切地說是 SELECT 中最後一個產生的那個!!!
-2
elliot at nospam dot rightnowtech dot com
23 年前
請記住,當你使用 'or die' 時,請關閉你的資料表,否則你可能會收到非 Internet Explorer 使用者困惑的表情。
-3
Dave O
19 年前
我透過郵件列表的幫助才發現這一點。如果你需要重設內部計數器,請使用 pg_result_seek,類似於

pg_result_seek($result, 0)

...從該函式的說明文件頁面的評論中抄襲而來。
To Top