產生查詢結果¶
有幾種方法可以產生查詢結果:
結果陣列¶
getResult()
這個方法會將查詢結果以 物件 陣列或 空 陣列(查詢失敗時)回傳。 一般情況下可以使用foreach迴圈,參考以下範例:
$query = $db->query("YOUR QUERY");
foreach ($query->getResult() as $row) {
echo $row->title;
echo $row->name;
echo $row->body;
}
上述方法的別名是 getResultObject()
。
如果你想要得到多重陣列的查詢結果,你可以在參數中傳送 『array』:
$query = $db->query("YOUR QUERY");
foreach ($query->getResult('array') as $row) {
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
上述方法的別名是 getResultArray()
。
你也可以傳送一個字串給 getResult()
,為每一個物件建立一個類別名稱。
which represents a class to instantiate for each result object
$query = $db->query("SELECT * FROM users;");
foreach ($query->getResult('User') as $user) {
echo $user->name; // access attributes
echo $user->reverseName(); // or methods defined on the 'User' class
}
上述方法的別名是 getCustomResultObject()
。
getResultArray()
這個方法將會回傳純陣列或空陣列(查詢結果為空時)的查詢結果。 一般情況下可以使用foreach迴圈,參考以下範例:
$query = $db->query("YOUR QUERY");
foreach ($query->getResultArray() as $row) {
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
結果列¶
getRow()
這個方法會回傳單筆查詢結果。如果你查詢的資料不只一筆,它只會回傳第一筆資料。 查詢結果會以 物件 的方式回傳。參考以下範例:
$query = $db->query("YOUR QUERY");
$row = $query->getRow();
if (isset($row)) {
echo $row->title;
echo $row->name;
echo $row->body;
}
如果你想要回傳特定的第幾筆資料,可以設定第一個參數為你想要的該筆資料:
$row = $query->getRow(5);
你也可以傳入第二個參數,這個結果物件將被實體化為的類別名稱。
$query = $db->query("SELECT * FROM users LIMIT 1;");
$row = $query->getRow(0, 'User');
echo $row->name; // access attributes
echo $row->reverse_name(); // or methods defined on the 'User' class
getRowArray()
同等於上述 row()
方法,不同的是它回傳是陣列。參考以下範例:
$query = $db->query("YOUR QUERY");
$row = $query->getRowArray();
if (isset($row)) {
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
如果你想要回傳特定的第幾筆資料,可以設定第一個參數為你想要的該筆資料:
$row = $query->getRowArray(5);
除此之外,你可以利用底下方式查詢到 前一筆/下一筆/第一筆/最後一筆 資料:
$row = $query->getFirstRow()
$row = $query->getLastRow()
$row = $query->getNextRow()
$row = $query->getPreviousRow()
預設回傳值為物件,除非設定第一個參數為 「array」:
$row = $query->getFirstRow('array')
$row = $query->getLastRow('array')
$row = $query->getNextRow('array')
$row = $query->getPreviousRow('array')
備註
上述的所有方法都會將結果載入到記憶體(prefetching)中。使用 getUnbufferedRow()
處理大量的資料集。
getUnbufferedRow()
這個方法會回傳單筆查詢結果,但並不會像 row()
將所有查詢結果預載到記憶體中。
如果你的查詢結果超過一筆,它將回傳該筆資料並將內部資料指標移動到下一筆資料。
$query = $db->query("YOUR QUERY");
while ($row = $query->getUnbufferedRow()) {
echo $row->title;
echo $row->name;
echo $row->body;
}
為了要與 MySQLi 一同使用,你可以將 MySQLi 回傳模式設定為 MYSQLI_USE_RESULT
,以節省最多的記憶體。通常我們不建議你使用這個模式,但在某些情況卻是有效的。例如,在大型的查詢後寫入 CSV 。如果改變了回傳模式,請自行注意相關的權衡。
$db->resultMode = MYSQLI_USE_RESULT; // for unbuffered results
$query = $db->query("YOUR QUERY");
$file = new \CodeIgniter\Files\File(WRITEPATH.'data.csv');
$csv = $file->openFile('w');
while ($row = $query->getUnbufferedRow('array'))
{
$csv->fputcsv($row);
}
$db->resultMode = MYSQLI_STORE_RESULT; // return to default mode
備註
使用 MYSQLI_USE_RESULT
時,若在同一連線上再進行後續呼叫,將會導致錯誤發生。請在所有回傳的紀錄被取走後或是呼叫 freeResult()
再進行後續呼叫。 getNumRows()
方法僅會回傳基於資料指標的當前位置的行數。MyISAM 資料表將會保持鎖定,直到所有回傳的紀錄被取走後或是呼叫 freeResult()
。
你可以選擇傳入 『object』 (預設)或 『array』 來指定回傳的資料型態:
$query->getUnbufferedRow(); // object
$query->getUnbufferedRow('object'); // object
$query->getUnbufferedRow('array'); // associative array
客製化查詢結果¶
你可以將查詢結果以自定義類別的實體做回傳,而不是像 getResult()
和 getResultArray()
,以stdClass或陣列的方式回傳。
如果類別沒有載入到記憶體中,Autoloader將會自動載入。
物件將會把資料庫中回傳的所有變數設定為屬性。
如果這些變數已經被宣告為非公開,那你應該要提供一個 __set()
的方法,讓它可以被設定。
範例:
class User
{
public $id;
public $email;
public $username;
protected $last_login;
public function lastLogin($format)
{
return $this->lastLogin->format($format);
}
public function __set($name, $value)
{
if ($name === 'lastLogin') {
$this->lastLogin = DateTime::createFromFormat('U', $value);
}
}
public function __get($name)
{
if (isset($this->$name)) {
return $this->$name;
}
}
}
除了以下列出的兩個方法之外,這些方法(例如: getFirstRow()
, getLastRow()
,
getNextRow()
, and getPreviousRow()
)也可以使用類別名稱的方式做回傳查詢結果。
getCustomResultObject()
以類別的實體之陣列an array of instances of the class requested.,回傳所有查詢結果集。 唯一要傳入的參數是要做為類別實體的名稱class to instantiate.
範例:
$query = $db->query("YOUR QUERY");
$rows = $query->getCustomResultObject('User');
foreach ($rows as $row) {
echo $row->id;
echo $row->email;
echo $row->last_login('Y-m-d');
}
getCustomRowObject()
從查詢結果中回傳單筆資料。第一個參數為要回傳的該筆資料,第二個參數為實體化的類別名稱。 The second parameter is the class name to instantiate.
範例:
$query = $db->query("YOUR QUERY");
$row = $query->getCustomRowObject(0, 'User');
if (isset($row)) {
echo $row->email; // access attributes
echo $row->last_login('Y-m-d'); // access class methods
}
你也能以完全相同的方式,使用 getRow()
這個方法。
範例:
$row = $query->getCustomRowObject(0, 'User');
結果輔助方法¶
getFieldCount()
回傳查詢後的欄位數量。確保使用查詢結果物件來呼叫這個方法。
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldCount();
getFieldNames()
回傳查詢後的欄位名稱陣列,確保使用查詢結果物件來呼叫這個方法。
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldNames();
getNumRows()
查詢回傳的結果數量。確保使用查詢結果物件來呼叫這個方法。
$query = $db->query('SELECT * FROM my_table');
echo $query->getNumRows();
備註
由於 SQLite3 缺少回傳紀錄數量的方法,因此 CodeIgniter 將會獲取緩衝查詢結果紀錄,並回傳陣列的計數,但這個方法可能造成低效能。
freeResult()
它將會釋放查詢後的記憶體並且刪除資源ID。 通常PHP會在腳本執行結束後自動釋放記憶體。 但是,如果你是在特定腳本中運行大量資料的查詢,你可能需要在每次查詢都需要釋放記憶體,以減少記憶體的消耗。
範例:
$query = $thisdb->query('SELECT title FROM my_table');
foreach ($query->getResult() as $row) {
echo $row->title;
}
$query->freeResult(); // The $query result object will no longer be available
$query2 = $db->query('SELECT name FROM some_table');
$row = $query2->getRow();
echo $row->name;
$query2->freeResult(); // The $query2 result object will no longer be available
dataSeek()
這個方法是設定下一次查詢的索引。它只會與 getUnbufferedRow()
結合使用。
它容納一個正整數,預設為0,成功回傳TRUE;失敗回傳FALSE。
$query = $db->query('SELECT `field_name` FROM `table_name`');
$query->dataSeek(5); // 忽略前5筆
$row = $query->getUnbufferedRow();
備註
並不是所有的資料庫驅動都會支援此方法或回傳FALSE。例如:你不可能在PDO中使用此方法。
物件參考¶
-
CodeIgniter\Database\BaseResult
-
getResult
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 含有請求結果的陣列
傳回型態: array
為
getResultArray()
、getResultObject()
和getCustomResultObject()
方法的包裝。詳細用法: 結果陣列
-
getCustomResultObject
($class_name)¶ 參數: - $class_name (string) – 查詢結果列的類別名稱
傳回: 含有請求結果的陣列
傳回型態: array
將查詢結果以陣列的方式回傳,陣列中的每個列都是所指定類別的實體。
-
getRow
([$n = 0[, $type = 'object']])¶ 參數: - $n (int) – 要回傳的查詢結果的索引
- $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 請求的列,如果不存在,則為 NULL
傳回型態: mixed
為
getRowArray()
、getRowObject()
和getCustomRowObject()
方法的包裝。詳細用法: 結果陣列
-
getUnbufferedRow
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 從查詢結果集合回傳下一筆的列,如果不存在,則為 NULL
傳回型態: mixed
取得下一筆查詢結果的列,並以請求的形式回傳。
詳細用法: 結果陣列
-
getRowArray
([$n = 0])¶ 參數: - $n (int) – 要回傳的查詢結果的索引
傳回: 請求的列,如果不存在,則為 NULL
傳回型態: array
以關聯陣列的方式回傳請求的結果列。
詳細用法: 結果陣列
-
getRowObject
([$n = 0])¶ 參數: - $n (int) – 要回傳的查詢結果的索引
傳回: 請求的列,如果不存在,則為 NULL
傳回型態: stdClass
以
stdClass
的物件方式回傳請求的結果列。詳細用法: 結果陣列
-
getCustomRowObject
($n, $type)¶ 參數: - $n (int) – 要回傳的查詢結果的索引
- $class_name (string) – 查詢結果列的類別名稱
傳回: 請求的列,如果不存在,則為 NULL
傳回型態: $type
以所請求類別的實體回傳請求的結果列。
-
dataSeek
([$n = 0])¶ 參數: - $n (int) – 下一個要回傳的結果列的索引
傳回: TRUE 代表成功,FALSE 代表失敗
傳回型態: bool
將內部結果列指針移動到所需要的偏移量。
詳細用法: 結果輔助方法
-
setRow
($key[, $value = NULL])¶ 參數: - $key (mixed) – 欄位名稱或鍵值陣列
- $value (mixed) – 要分配給欄位的值, $key 是一個單一欄位的名稱
傳回型態: void
分配數值給特定的欄位
-
getNextRow
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 查詢結果集合的下一筆列,如果不存在,則為 NULL
傳回型態: mixed
回傳查詢結果集合的下一筆列
-
getPreviousRow
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 查詢結果集合的上一筆列,如果不存在,則為 NULL
傳回型態: mixed
回傳查詢結果集合的上一筆列
-
getFirstRow
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 查詢結果集合的第一筆列,如果不存在,則為 NULL
傳回型態: mixed
回傳查詢結果集合的第一筆列
-
getLastRow
([$type = 'object'])¶ 參數: - $type (string) – 請求結果的類型 - 陣列、物件或類別名稱
傳回: 查詢結果集合的最後一筆列,如果不存在,則為 NULL
傳回型態: mixed
回傳查詢結果集合的最後一筆列
-