PHPLib可能是伴随PHP一同成长最老的数据库抽象层(但和ADODB相比,它只算是一个MySQL抽象类库),当前最新版本为7.4a。我们只需要它的数据库访问功能,除了支持MySQL外,它也同时支持访问Oracle 8以上版本的数据库。
PHPLib访问SQL数据的类名为DB_Sql,包含在db_mysql.inc.php文件中。我们要使用的仅是它的数据库抽象类,直接用require()和include()包含进来就可以进行开发了。下面是开发实例,并且所用类库都是最新版本,这些都可以在光盘中找到。
首先定义一个配置文件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");
}
我们也可以开发一个函数,像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小巧方便,对于系统负载相对较小。如果仍在旧版本下或虚拟主机环境下进行开发,使用它也是不错的选择。
联系客服