SQLite 迭代器
在 PHP 5.0 中,有另外一種方式來從查詢中獲得行數據,那就是運用迭代器.
$db = new SQLiteDatabase("db.sqlite");
// 執行非緩沖的查詢可以減少內在的使用.
$res = $db->unbufferedQuery("SELECT * FROM foo");
foreach ($res as $row) { //迭代結果集對象
// 輸出代碼
print_r($row);
}
?>
迭代對象的工作過程除了不需要要鍵值(’keys’)和用 一個值來表示數組中所包含的特定的數據行之外,其它跟通過foreach()訪問數組對象很相似.因為迭代器是內部引擎句柄而不是函數. 迭代器跟sqlite_fetch_*()函數比較用到的PHP代碼就少得很多了.并且不需要把結果集緩沖到內存中.總之,迭代器是一種非??焖?但是簡 單易用的獲取數據的方法.運用SQLite的對象迭代器,不會存在什么不足之處,當你需要遍歷一個多行數據集時,你一定應該考慮使用它們.
工具函數
SQLite擴展也提供了一些在操作數據庫時使用起來很方便的工具函數.其中一個就是sqlite_num_fields(), 可以用于獲得一個特定的結果集中的字段數(列數).
當 然,也有其它選擇,如果你想取得數據的同時得到列數,你可以對數據集使用count()方法,就可以獲得上面函數相同的數目.如果同時取回了字符串型和數 字型的主鍵,你必須讓結果一分為二,因為結果數組中的字段入口數會是字段數的兩倍.如果你的腳本需要獲得特定表的列名時,這個數目是很有用的.如果是這樣 的話,你就可以在一個循環中用sqlite_field_name()來獲得字段名稱信息.正如下例所示.[譯者注,本例是PHP5的情況,用的是OO接 口,在PHP4中,需要變換相對應的函數,具體請參見PHP Manual SQLite的參考一節]
$db = new SQLiteDatabase("db.sqlite");
$res = $db->unbufferedQuery("SELECT * FROM foo LIMIT 1");
//取得字段數目
$n_fields = $res->numFields();
$i = 0;
while ($i < $n_fields) {
//獲得單個字段名
$field_name = $res->fieldName($i );
echo $field_name."/n";
}
?>
很顯然,這是 獲得表中列名的一種很理想的方式.很明顯示地,當源表中沒有任何行時,這個方式就會失敗.并且這個方法取了一些你可能并不想用的數據,因此,一個更好的解 決方法是用sqlite_fetch_column_types()函數.這具函數 會返回特定表的列和類型,而不管表中的數據量如何.
緩存優勢
在很多情況下,由于性能和內存的原因,你可能想執行非緩沖查詢.盡管如此,這存在在某種情況下所必須的輕微的功能損失.這也就說明為什么,非緩沖查詢不總是最優的選擇.
例如,假設你 想知道你的查詢到底取回了多少行數據.如果用非緩存查詢的話,你必須一行行地查詢,才能知道這個數目.而用緩存查詢,只要不費吹灰之力地執行 sqlite_num_rows()函數就可以了. 這就可以取回查詢結果的行數.非緩存查詢還僅限于線性數據獲取,這就意味著你必須取得一系列中所有行的信息,一次一行.而對于緩存查詢則沒有這個限制.你 可用sqlite_seek() 函數來到達任意一行,并且取回數據.只要需要,逆向地獲取行數據也是可以的.
$db = new SQLiteDatabase("db.sqlite");
$res = $db->query("SELECT * FROM foo");
$n_rows = $res->numRows(); // 獲得行數
$res->seek($n_rows - 1); // 到最后一行
// 返回獲取數據
do {
$data = $res->current(SQLITE_ASSOC); // 獲得行數據
print_r($data);
}
while ($res->hasPrev()&& $res->prev()); // 逆向前進,直到第一行
?>
定制函數
新聞熱點
疑難解答