首页 > 数据库 > SQLite > 正文

SQLite 入门介绍(三)

2020-02-10 17:55:08
字体:
来源:转载
供稿:网友

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()); // 逆向前进,直到第一行

?>

定制函数

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表