sqlite入门之使用 SQLite 数据库
sqlite入门之使用 SQLite 数据库
使用 SQLite
SQL面向过程的接口跟MySQL和其它数据库的接口几乎是同样的.因而,对于大部分的将其它数据库迁移到SQLite的工作仅是将函数前缀mysql/pq/等等...改为sqlite.
// 创建一个新的数据库 (面向过程接口)
$db = sqlite_open("db.sqlite");
// 如果你还需创建表foo,请将下面一句的注释标志清除.
// sqlite_query($db , "CREATE TABLE foo (id INTEGER PRIMARY KEY, name CHAR(255))");
//插入示例数据
sqlite_query($db, "INSERT INTO foo (name) VALUES ('Ilia')");
sqlite_query($db, "INSERT INTO foo (name) VALUES ('Ilia2')");
sqlite_query($db, "INSERT INTO foo (name) VALUES ('Ilia3')");
// 执行查询
$result = sqlite_query($db, "SELECT * FROM foo");
// 迭代访问数据行
while ($row = sqlite_fetch_array($result)) {
print_r($row);
/*查询结果的每一行如下所示
Array
(
[0] => 1
[id] => 1
[1] => Ilia
[name] => Ilia
)
*/
}
// 手动关闭数据连接
sqlite_close($db);
?>
SQLite和其它数据库一个大的不同在于其数据库引擎本身.不象其它数据库,SQLite是松散型的. SQLite中所有数据库都以空字符串结尾而不是对特定的列类型用特定的二进制表现.为了兼容性的原因,SQLite仍然在表创建时支持一些类型规范, 比如INT, CHAR, FLOAT, TEXT如此等等,但是实际上并没有用到这些数据类型.在内部,SQLite仅仅对字符串和整形在排序期间作了区分.因此,如果你不是有意地排序数据,你可以无需在CREATE TABLE语句 中指定数据类型.
SQLite的类型无关特性也在一定程度上降低了其数据排序和数据比较的速度.因为,每一次比较SQLite都需要判断数据,然后来决定是用字符串还是用数字型比较的机制.SQL表格也提供了自动增长的键值以对数据行快速访问. 同时也意味着对最后插入的一行的引用的访问.在SQLite里,这有一个不太常见的语法规则. 要创建这样一个自动增长的键值的字段,你必须将字段声明为INTEGER PRIMARY KEY, 而不是将其指定为一个特殊类型,并赋值以附加属性来指出这是一个自增长的字段.
链式查询
正如你所想象的.SQLite拥有许多提高其效能和扩展其功能的新的特性.这些特性的其中这五就是执行链式查询的能力.这就意味着你可以通过一个查询函数来执行多条查询.这大大地减少了你需要运行的PHP函数的量.也提高了脚本运行的速度.这也允许你在事特处理中包含查询语句块.大大提高性能.这是当执行多条写查询时提高性能的重要因素.当然,运用这个功能时也需要考虑到一些带来混乱的问题.
如果SQLite中的任何查询用到了用户指定的输入,你必须仔细地验证用户的输入以防止SQL注射攻击.不像MySQL,SQL注射仅仅导致一个令人难堪的查询错误.在SQLite中,允许攻击者在你的服务器上执行查询,可能导致潜在的灾难性的后果.如果查询展示会中包含了插入语句,并且你希望获得id, sqlite_last_insert_rowid() 函数可以达到这个目的,仅仅取得最后一次插入的id.另外一方面,当试图知道多少行受到查询影响时,可以用sqlite_changes(),这个函数的结果 就是所有执行的查询所影响的总行数.如果你的查询块中包含了SELECT,请确保它是第一个查询.否则你的结果集将不包含查询中所存取的行.
// 创建一个仅在内存中的数据库(不存为文件的)
$db = new SQLiteDatabase(":memory:");
// 创建一个两列的表 bar ,并且在其中插入两行.
/* 为了提高性能,整个查询块封装在 一个事物中. */
$db->query("BEGIN;
CREATE TABLE bar ( id INTEGER PRIMARY KEY, id2 );
INSERT INTO bar (id2) VALUES(1);
INSERT INTO bar (id2) VALUES(2);
COMMIT;");
// 将输出"2 insert queries"
echo $db->changes()." insert queries\n";
// 将输出 "last inserted row id: 2"
echo "last inserted row id: ".$db->lastInsertRowid();
?>
新函数
除了向后前进的特性,(back end features), SQLite 也提供了一系统简化和提供数据存取速度的函数.
$db = new SQLiteDatabase("db.sqlite");
/* 执行查询,并将查询结果存入数组中 */
$result_array = $db->arrayQuery("SELECT * FROM foo", SQLITE_ASSOC);
print_r($result_array);
?>
这个函数使得查询执行和数据存取都由一个函数调用来实现.大大地减少了整个PHP执行的过程.PHP脚本也大大地简化,现在你只要一单个函数就可以了,而否则的话你将要在一个循环中调用一系列数据存取函数.例如,如果仅仅是需获得一列,可以用函数sqlite_single_query(),这将立刻返回 一个字符串或者一个字符串数组,这将取决于有多少行数据被查询出来.
$db = sqlite_open("db.sqlite");
// 获得列的id (作为字符串)
$id = sqlite_single_query($db, "SELECT id FROM foo WHERE name='Ilia'");
var_dump($id); //string(1)
// 如果结果多于一行,返回的将是数组
$ids = sqlite_single_query($db, "SELECT id FROM foo WHERE name LIKE 'I%'");
var_dump($ids); // array(3)
?>
正如运用其它许多特性一样,你应该合理地使用它而不是滥用它.当在一个查询中一次存取所有数据时,你要记得查询结果的所有数据是保存在内存中的.如果结果集中包含大量的数据,内存的分配就会将减少函数调用次数所带来的性能优势化为子虚乌有.因此,请在存取的数据量比较小的情况下运用这些函数.