另外,對於那些嘗試從 Oracle 遷移的人來說,`pg_fetch_all` 返回的陣列的行和列與 `ocifetchall` 的意義相反。在您的程式碼將第一個索引作為欄位名稱,第二個索引作為列索引之前,您需要轉置此結果陣列。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_fetch_all — 將所有列從結果集中以陣列形式取出
result
由 pg_query()、pg_query_params() 或 pg_execute()(以及其他函數)返回的 PgSql\Result 實例。
mode
一個可選參數,用於控制返回的 陣列 的索引方式。 mode
是一個常數,可以採用以下值:PGSQL_ASSOC
、PGSQL_NUM
和 PGSQL_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 ) )
另外,對於那些嘗試從 Oracle 遷移的人來說,`pg_fetch_all` 返回的陣列的行和列與 `ocifetchall` 的意義相反。在您的程式碼將第一個索引作為欄位名稱,第二個索引作為列索引之前,您需要轉置此結果陣列。
儘管應用程式註釋說明不同,`pg_fetch_all` 只接受一個參數,即結果集。它的作用與預期完全一樣,返回一個二維結果集陣列。我懷疑給定的應用程式註釋只是從 `pg_fetch_array` 複製過來的,而這才是您想要用於單列資料的函式。
`pg_fetch_all()` 似乎只適用於 4.3.x 版本。我在 4.2.2 版本中嘗試過,它不識別該函式,所以我認為它不適用於 4 => 4.2.x 版本。
對於那些感到疑惑的人,這個函式返回一個二維陣列,第一維是一個從 0 開始索引的陣列,第二維是一個關聯陣列。因此,您可以使用 `$authors[0]["surname"]` 訪問第一個作者的姓氏。
在 PHP 5.2.9 中肯定是這種情況,但我不能保證其他版本也是如此。
請注意,`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 您的查詢並使用欄位別名來避免混淆是很容易避免的。
如果您在 `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 版本,我撰寫了一些函式,例如:
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;
}
}