PHPLib可能是伴随PHP一同成长最老的数据库抽象层(但和ADODB相比,它只算是一个MySQL抽象类库),当前最新版本为7.4a。我们只需要它的数据库访问功能,除了支持MySQL外,它也同时支持访问Oracle 8以上版本的数据库。 PHPLib访问SQL数据的类名为DB_Sql,包含在db_mysql.inc.php文件中。我们要使用的仅是它的数据库抽象类,直接用require()和include()包含进来就可以进行开发了。下面是开发实例,并且所用类库都是最新版本,这些都可以在光盘中找到。 17.5.1 使用PHPLib查询首先定义一个配置文件config.inc.php,用于扩展PHPLib的MySQL类:DB_Sql。代码内容如下: <?php /*** 系统路径,可根据需求更改路径 */ define('ROOT', './'); /*** PHPLib library path */ define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', 'root'); define('DB_NAME', 'phpdev'); require_once(ROOT."lib/db.inc.php"); $db = new DbClass; /* 设置字符集,如utf-8和gbk、Latin1等,根据数据库的字符集而定,如果是Latin1,则可以不需要运行 */ $sql = "SET NAMES 'utf8'"; $db->query($sql); ?> 上面代码引用的db.inc.php用于扩展DB_Sql类,主要是重新声明连接的数据库和账号,以及出错信息的处理和显示功能,如下所示。 <?php require_once("db_mysql.inc.php"); class DbClass extends DB_Sql{ public $Host; public $Database; public $User; public $Password; function __constructor() { $this->Host = DB_HOST; $this->Database = DB_NAME; $this->User = DB_USER; $this->Password = DB_PASSWORD; } function halt($msg) { printf("</td></table><b>Database Error:</b> %s<br>\n", $msg); printf("<b>MySQL Error</b>: %s (%s)<br>\n", $this->Errno, $this->Error); printf("Please contact administrator and report the "); printf("exact error message.<br>\n"); die("Session halted."); } } ?> 我们还以symbols表为例,查询该表的数据,然后全部显示出来。 <html> <head> <title>国家代表动物</title> </head> <body> <?php require_once('lib/config.inc.php'); $sql = "SELECT * from symbols"; //也可以使用该方法执行INSERT、UPDATE、DELETE等SQL查询 $db->query($sql); ?> <table cellpadding=10 border=1> <tr> <?php while($db->next_record()) { $country = $db->f("country"); $animal = $db->f("animal"); $cname = $db->f("cname"); echo "<tr>"; echo("<td><b>国家:</b> </td><td>$country </td><td><b>代表动物:</b> </td><td>$animal ($cname) </td>\n"); echo "</tr>"; } ?> </tr> </table> </body> </html> 显示结果如下: 关于$db->next_record(),这是一个没有返回值的语句,它的功能是将当前表的指针向前移动并更新Record、Error、Row、Errno的方法。 while($db->next_record()) { … } 我们根据它的指针循环操作,直至到达尾记录,若条件不满足,则while退出循环。 $name = $db->f("name"); 给$name变量分配的是数据字段name的值。 echo("<p><b>国家:</b> $country <b>代表动物:</b> $animal ($cname)<br>\n"); echo("</p>\n\n"); 打印出一行数据,也可不用变量赋值,而是直接引用方法返回的字段名即可,但是这种方法没有上面程序的可读性好。 while($db->next_record()) { echo("<p><b>国家:</b> ".$db->f("country")." <b>代表动物:</b> " .$db->f("animal")."(".$db-f("cname")."<br>\n"); echo("</p>\n\n"); } 17.5.2 创建GetAll方法我们也可以开发一个函数,像ADODB或PDO那样,让抽出的记录生成一个二维关联数组。这样,PHPLib同样也可以与Smarty引擎协同工作,并且工作更方便,请看如下代码。 <?php function GetAll($sql){ global $db; //全局PHPlib $db的实例 $db->query($sql); $Array = array(); $j= 0; while($db->next_record()) { $Array[$j]= $db->Record; $j++; } return $Array; } ?> 然后把该方法放在一个文件中,比如func.inc.php,同样保存在lib目录下。这样,我们再不用每次都重复使用while循环,直接调用该函数即可。 <?php require_once('lib/config.inc.php'); require_once('lib/func.inc.php'); $sql = "SELECT * from symbols WHERE country='China'"; $getAnimal = GetAll($sql); print_r($getAnimal); ?> 在浏览器上的显示结果如下: Array ( [0] => Array ( [0] => 2 [id] => 2 [1] => China [country] => China [2] => dragon [animal] => dragon [3] => 龙 [cname] => 龙 ) ) GetAll方法产生的$getAnimal关联数组和ADODB的是一样的,这样,我们可以让PHPLib和Smarty匹配,把该数组抛给模板显示即可。 虽然没有ADODB、PDO那么强大,但PHPLib小巧方便,对于系统负载相对较小。如果仍在旧版本下或虚拟主机环境下进行开发,使用它也是不错的选择。 |
|