如果您使用 PGSQL_ASSOC 或 PGSQL_BOTH,則欄位名稱永遠為小寫,無論資料庫或查詢中的名稱是什麼。
(PHP 4, PHP 5, PHP 7, PHP 8)
pg_fetch_array — 以陣列形式擷取一列
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_ASSOC
、PGSQL_NUM
和 PGSQL_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";
?>
從 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...
PGSQL_BOTH 是預設值,這表示你的陣列大小會加倍。
如果你指定這個欄位(結果類型),請不要在它周圍加上引號,否則你不會得到任何資料,甚至連錯誤訊息也不會。
這是我的包裝函式
function SQL_fetch_array($result_ndx, $row, $result_type=PGSQL_ASSOC) {
return pg_fetch_array($result_ndx, $row, $result_type);
除了在「沒有更多列」時返回 "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;
?>
請注意,當使用 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"
// }
?>
(省時提示)請注意,此函式返回的陣列中的鍵(至少在 4.2.3 版中)與 SQL 欄位名稱的大小寫相同(例如,如果你的欄位名稱是 ID,那麼鍵名稱也是 ID,而不是 id 或 Id),而且關聯陣列中的鍵是區分大小寫的!!! 所以如果得到非預期的結果,請不要感到驚訝。仔細檢查 SQL 欄位名稱和鍵名稱。
針對下方 eth0 關於從兩個資料表 SELECT 資料,而資料表有相同名稱欄位的評論,你可以這樣解決這個問題
"SELECT table1.foo AS foo1, table2.foo AS foo2 FROM table1, table2"
在返回的關聯陣列中,鍵將會是 "foo1" 和 "foo2"。
希望大多數人都能自己意識到這一點,但下面人們嘗試在結果中取得數值或關聯(而非兩者)鍵的做法,其實是毫無意義的。請參閱 pg_fetch_assoc() 和 pg_fetch_row(),它們是內建函式,可以自動執行此操作。通常,最好使用這些其他函式之一,除非你 *需要* 同時透過欄位名稱 *和* 索引存取欄位。
因為指定結果類型的方式不太清楚,所以我發佈這則訊息。
我寫了一個看起來像這樣的包裝函式
<?php
function db_fetch_array ($result, $row = NULL, $result_type = PGSQL_ASSOC)
{
$return = @pg_fetch_array ($result, $row, $result_type);
return $return;
}
?>
我認為這樣做可以很方便地取得你想要的陣列。
請記住,如果你有例如一個 Customers 資料表,其中包含 "cust_ID"、"name" 和 "address",以及另一個 Users 資料表,其中包含 "u_ID"、"name" 和 "other",然後你執行 SELECT WHERE cust_ID=u_ID,那麼你在結果陣列中只會得到一個 "name" 欄位,確切地說是 SELECT 中最後一個產生的那個!!!
請記住,當你使用 'or die' 時,請關閉你的資料表,否則你可能會收到非 Internet Explorer 使用者困惑的表情。