PHP和SQLite通信
现在,使用PHP和SQLite通信,生成同样的结果集然后将其格式化为HTML页面。下面是代码:
<html> <head></head> <body> <?php // set path of database file $db = $_SERVER['DOCUMENT_ROOT']."/../library.db"; // open database file $handle = sqlite_open($db) or die("Could not open database"); // generate query string $query = "SELECT * FROM books"; // execute query $result = sqlite_query($handle, $query) or die("Error in query:
".sqlite_error_string(sqlite_last_error($handle))); // if rows exist if (sqlite_num_rows($result) > 0) { // get each row as an array // print values echo "<table cellpadding=10 border=1>"; while($row = sqlite_fetch_array($result)) { echo "<tr>"; echo "<td>".$row[0]."</td>"; echo "<td>".$row[1]."</td>"; echo "<td>".$row[2]."</td>"; echo "</tr>"; } echo "</table>"; } // all done // close database file sqlite_close($handle); ?> </body> </html>
如果所有都运行良好,那么你应该看到像下面这样的结果:

如果你记得你在第八章中所学到的,那么上述的PHP脚本应该很容易理解。如果你不理解,那么下面是一个快速的纲要:
1. 脚本以sqlite_open()函数开始,该函数接受数据库文件名称作为参数然后试图打开该文件。如果不能找到该数据库文件,那么一个以所提供的名字命名的空白数据库文件将被创建(假定脚本对于目录有写的权限)。
<?php $db = $_SERVER['DOCUMENT_ROOT']."/../library.db"; $handle = sqlite_open($db) or die("Could not open database"); ?>
数据库文件library.db需要保存在不能被你的站点的访问者通过浏览器访问的地方。这意味着你需要在public_html、www或者htdocs目录之外的目录内创建该文件,该目录允许你的脚本读/写。提供Web站点主机的公司通常会在你的可见Web目录之上提供一空间,在该空间中你可以创建文件。$_SERVER['DOCUMENT_ROOT']."/.."是直接在你的可见Web目录之上的目录。
如果sqlite_open()执行成功,那么它会返回该文件一个句柄,该句柄存储在变量$handle中而且用于与数据库的所有的后续通信。
2. 下一步是创建查询然后使用sqlite_query()函数来执行该查询。
<?php $query = "SELECT * FROM books"; $result = sqlite_query($handle, $query) or die("Error in query:
".sqlite_error_string(sqlite_last_error($handle))); ?>
该函数也需要两个参数:数据库句柄和查询字符串。函数根据查询是否成功而返回真或假;如果出现失败,sqlite_error_string()和sqlite_last_error()函数可以用来显示发生的错误。
3. 如果sqlite_query()执行成功,查询所返回的结果集存储于变量$result中。你可以使用sqlite_fetch_array()函数来获取结果集中的记录,该sqlite_fetch_array()函数可以取出一单行数据而且将其作为为$row数组表示。上述被取出的记录中的字段用数组元素表示且可以使用标准的索引符号来访问。
每次当你调用sqlite_fetch_array()函数时,结果集中的下一条记录被返回。这使得sqlite_fetch_array()非常适合用于while()循环中,与之前使用mysql_fetch_row()函数的方式完全相同。
查询所返回的记录的数目可以使用sqlite_num_rows()函数来取得。或者如果你真正感兴趣的是结果集中的字段数,那么请使用sqlite_num_fields()函数。当然,这些函数只可用于返回记录的查询;将它们用于INSERT、UPDATE或者DELETE查询实际上没有多少意义。<?php if (sqlite_num_rows($result) > 0) { echo "<table cellpadding=10 border=1>"; while($row = sqlite_fetch_array($result)) { echo "<tr>"; echo "<td>".$row[0]."</td>"; echo "<td>".$row[1]."</td>"; echo "<td>".$row[2]."</td>"; echo "</tr>"; } echo "</table>"; } ?>
4. 一旦你完成了所有的任务,那么调用sqlite_close()函数关闭数据库句柄然后将消耗的内存返回给系统是个好注意。
<?php sqlite_close($handle); ?>
在PHP 5中,你也可以以面向对象的方式来使用SQLite API,其中上述每一个函数都变成了SQLiteDatabase()对象的一个方法。请看下面的列表,它和上面的是等价的:
<html> <head></head> <body> <?php // set path of database file $file = $_SERVER['DOCUMENT_ROOT']."/../library.db"; // create database object $db = new SQLiteDatabase($file) or die("Could not open database"); // generate query string $query = "SELECT * FROM books"; // execute query // return result object $result = $db->query($query) or die("Error in query"); // if rows exist if ($result->numRows() > 0) { // get each row as an array // print values echo "<table cellpadding=10 border=1>"; while($row = $result->fetch()) { echo "<tr>"; echo "<td>".$row[0]."</td>"; echo "<td>".$row[1]."</td>"; echo "<td>".$row[2]."</td>"; echo "</tr>"; } echo "</table>"; } // all done // destroy database object unset($db); ?> </body> </html>
在这里,通过传递给对象构造器数据库文件名称,new关键字用于实例化类SQLiteDatabase()的一个对象。如果数据库文件不存在,那么创建一个新的数据库文件。存储于变量$db中的生成的对象然后展示用于执行查询的方法和属性。每个查询返回类SQLiteResult()的一个实例,而该实例反过来展示用于取得和处理记录的方法。
如果你仔细查看上述两个脚本,那么你会看到过程化的函数名称和对象方法名称之间的大量的相似性。虽然两者之间的对应不完美,但通常情况下足够接近以使得如果你知道一个的话猜到另外一个是可能的。