分享

PHPLib

 sumi2005 2012-04-29

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小巧方便,对于系统负载相对较小。如果仍在旧版本下或虚拟主机环境下进行开发,使用它也是不错的选择。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多