PHP Conference Japan 2024

pg_fetch_all

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_fetch_all將所有列從結果集中以陣列形式取出

說明

pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): array

pg_fetch_all() 會傳回一個陣列,其中包含 PgSql\Result 實例中的所有列(記錄)。

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

參數

result

pg_query()pg_query_params()pg_execute()(以及其他函數)返回的 PgSql\Result 實例。

mode

一個可選參數,用於控制返回的 陣列 的索引方式。 mode 是一個常數,可以採用以下值:PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。使用 PGSQL_NUM,函數將返回一個具有數字索引的陣列;使用 PGSQL_ASSOC,它將僅返回關聯索引;而 PGSQL_BOTH 將同時返回數字和關聯索引。

返回值

一個包含結果中所有行的 陣列。每一行都是一個欄位值的陣列,以欄位名稱作為索引。

更新日誌

版本 說明
8.1.0 result 參數現在需要一個 PgSql\Result 實例;以前需要的是一個 資源
8.0.0 對於零行的結果集,pg_fetch_all() 現在將返回一個空的 陣列,而不是 false
7.1.0 新增了 mode 參數。

範例

範例 #1 PostgreSQL 獲取所有資料

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

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

$arr = pg_fetch_all($result);

print_r($arr);

?>

上述範例將輸出類似以下的內容

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Fred
        )

    [1] => Array
        (
            [id] => 2
            [name] => Bob
        )

)

另請參閱

新增註釋

使用者貢獻的註釋 9 則註釋

匿名
21 年前
另外,對於那些嘗試從 Oracle 遷移的人來說,`pg_fetch_all` 返回的陣列的行和列與 `ocifetchall` 的意義相反。在您的程式碼將第一個索引作為欄位名稱,第二個索引作為列索引之前,您需要轉置此結果陣列。
ilhan at ilhan dot name
8 年前
PG 函式以字串形式擷取資料。如果您想要自動轉換類型,則需要使用 PDO。
jcomeau at whatisthewww dot com
21 年前
儘管應用程式註釋說明不同,`pg_fetch_all` 只接受一個參數,即結果集。它的作用與預期完全一樣,返回一個二維結果集陣列。我懷疑給定的應用程式註釋只是從 `pg_fetch_array` 複製過來的,而這才是您想要用於單列資料的函式。
tasmanian at devil dot com
21 年前
`pg_fetch_all()` 似乎只適用於 4.3.x 版本。我在 4.2.2 版本中嘗試過,它不識別該函式,所以我認為它不適用於 4 => 4.2.x 版本。
prefer_not_to at say dot com
15 年前
對於那些感到疑惑的人,這個函式返回一個二維陣列,第一維是一個從 0 開始索引的陣列,第二維是一個關聯陣列。因此,您可以使用 `$authors[0]["surname"]` 訪問第一個作者的姓氏。

在 PHP 5.2.9 中肯定是這種情況,但我不能保證其他版本也是如此。
strata_ranger at hotmail dot com
15 年前
請注意,`pg_fetch_all()` 與 `pg_fetch_assoc()` 受到相同的限制,即如果您的查詢返回多個同名(或別名)的欄位,則關聯陣列中只會返回最右邊的那個,其他欄位將不會返回。

一個簡單的例子
<?php
$res
= pg_query(
"SELECT a.*, b.* -- 從兩個表格擷取所有欄位
FROM table1 AS a

LEFT OUTER JOIN table2 as b
USING (column)"
);

$rows = pg_fetch_all($res);
?>

在此範例中,由於我們是透過 * 選擇欄位,如果 `table2` 中的任何欄位與 `table1` 中的欄位同名,則它們將會是返回的欄位,即使 `table2`(作為外連接的可選側)可能會返回 NULL 值。

這不是錯誤,只是關聯陣列的普遍限制,透過仔細 structuring 您的查詢並使用欄位別名來避免混淆是很容易避免的。
viniciusweb at gmail dot com
19 年前
如果參數為 false,則此函式返回 NULL。
humbertoibanez at gmail dot com
9 年前
如果您在 `pg_hba.conf` 檔案中設定了使用 md5 方法的連線,但您沒有為該使用者設定密碼,則您必須使用 PostgreSQL 命令 “alter role” 定義密碼

alter role user_name encrypted password 'user_password';

此外,如果您透過 TCP/IP (host) 類型連線,且您的 IP 位址不是 (localhost),例如 (127.0.1.1),則您必須取消註釋 `postgresql.conf` 檔案中的以下行,並加入您的 IP 位址

listen_addresses = 'localhost,127.0.1.1'

儲存新的設定後,您必須重新啟動 PostgreSQL 服務。
php dot net at mechintosh dot com
21 年前
針對尚不支援新名稱或較新函式的 PHP 版本,我撰寫了一些函式,例如:

if (! function_exists("pg_fetch_all")) {
function pg_fetch_all($res, $kind="assoc") {
$i = 0; // 迴圈 pg_fetch_array 中所需的列整數
if ($kind == "assoc") {
while ($row = pg_fetch_array($res, $i, PGSQL_ASSOC)) {
$array_out[] = $row;
$i++;
}else{
while ($row = pg_fetch_array($res)) {
$array_out[] = $row;
}
}
return $array_out;
}
}
To Top