PHP Conference Japan 2024

SQLite3Result::fetchArray

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::fetchArray 將結果列擷取為關聯式陣列或數字索引陣列,或兩者兼具

說明

public SQLite3Result::fetchArray(int $mode = SQLITE3_BOTH): array|false

將結果列擷取為關聯式陣列或數字索引陣列,或兩者兼具。預設為兩者兼具。

參數

模式

控制下一列資料回傳給呼叫者的方式。此值必須是 SQLITE3_ASSOCSQLITE3_NUMSQLITE3_BOTH 其中之一。

  • SQLITE3_ASSOC:回傳以欄位名稱作為索引的陣列,如同相對應的結果集所回傳的。

  • SQLITE3_NUM:回傳以欄位編號作為索引的陣列,如同相對應的結果集所回傳的,從 0 開始。

  • SQLITE3_BOTH:回傳同時以欄位名稱和編號作為索引的陣列,如同相對應的結果集所回傳的,從 0 開始。

回傳值

以關聯式或數字索引陣列或兩者回傳結果列。如果沒有更多列,則會回傳 false

回傳陣列值的類型會從 SQLite3 類型進行映射,如下所示:整數如果落在 PHP_INT_MINPHP_INT_MAX 的範圍內,則會映射到 int,否則映射到 string。浮點數會映射到 floatNULL 值會映射到 null,字串和二進位大型物件 (BLOB) 會映射到 string

新增註記

使用者貢獻的註記 4 則註記

18
Jason
10 年前
僅想說明一下,每次呼叫 fetchArray() 都會以陣列形式回傳 SQLite3Result 的下一個結果,直到沒有更多結果為止,此時下一次呼叫 fetchArray() 將會回傳 false。

然而,此時再次呼叫 fetchArray() 將會重置回結果集的開頭,並再次回傳第一個結果。這一點似乎沒有明確記載,並讓我自己頭痛了一段時間,直到我弄清楚為止。

例如

<?php
$returned_set
= $database->query("select query 或其他查詢");

//假設查詢回傳了 3 個結果
//通常以下的 while 迴圈會執行 3 次,因為在第四次呼叫 fetchArray() 之前,$result 不會是 false
while($result = $returned_set->fetchArray()) {
//然而,在迴圈中再次呼叫 fetchArray() 將會導致迴圈再次執行
$returned_set->fetchArray();
}
?>

基本上,在上面的程式碼中,fetchArray 將會回傳…
第一次呼叫 | 從 $returned_set 取得的第一個結果(來自 while 條件式中的 fetchArray() 呼叫)
第二次呼叫 | 第二個結果(來自 while 區塊中的 fetchArray() 呼叫)
第三次呼叫 | 第三個結果(來自 while 條件式中的 fetchArray() 呼叫)
第四次呼叫 | FALSE(來自 while 區塊中的 fetchArray() 呼叫)
第五次呼叫 | 第一個結果(來自 while 條件式中的 fetchArray() 呼叫)
....

這將導致(至少在這種情況下)while 迴圈無限執行。
11
paule-panke at example dot com
7 年前
在呼叫 SQLite3Result::fetchArray() 之前,請使用 SQLite3Result::numColumns() 檢查結果是否為空。

與文件說明不同的是,SQLite3::query() 總是返回一個 SQLite3Result 實例,不僅僅針對返回列的查詢(SELECT、EXPLAIN)。每次在無結果查詢的結果上呼叫 SQLite3Result::fetchArray() 時,都會在內部再次執行查詢,這很可能會導致應用程式出錯。
對於框架或 API 來說,事先無法知道查詢是否會返回列(SQLite3 支援多語句查詢)。因此,「不要執行 query('CREATE ...')」的論點是無效的。
2
alan at synergymx dot com
14 年前
迴圈讀取記錄集

<?php
$db
= new SQLite3('auth.sqlite');

$sql = "SELECT user_id, username, opt_status FROM tbl_user";

$result = $db->query($sql);//->fetchArray(SQLITE3_ASSOC);

$row = array();

$i = 0;

while(
$res = $result->fetchArray(SQLITE3_ASSOC)){

if(!isset(
$res['user_id'])) continue;

$row[$i]['user_id'] = $res['user_id'];
$row[$i]['username'] = $res['username'];
$row[$i]['opt_status'] = $res['opt_status'];

$i++;

}

print_r($row);
?>
0
ghaith at cubicf dot net
7 年前
// 開啟一個新的 sqlite3 資料庫

$db = new SQLite3('./DB_EHLH.db');

// 從 "algorithm" 資料表選取所有資訊

$results= $db->query("select * from algorithm");

//建立陣列來儲存所有結果
$data= array();

// 取得關聯式陣列 (1 代表 SQLITE3_ASSOC)
while ($res= $results->fetchArray(1))
{
//將列插入陣列
array_push($data, $res);

}

//您可以回傳一個 JSON 陣列
echo json_encode($data);

//輸出如下
[
{"id":1,"algorithm":"GA"},
{"id":2,"algorithm":"PSO"},
{"id":3,"algorithm":"IWO"},
{"id":4,"algorithm":"OIWO"}
]
To Top