phplib是php的一些扩展库,使用它我们可以很方便地对数据库进行各种操作,不过,如果你要使用多个数据库的话,它就显得力不从心了,本文介绍了通过扩展phplib,让你鱼和熊掌兼得,在使用phplib的同时可以使用多个数据库,而且从中你也可以了解到面向对象编程和如何扩展库的知识,值得一读。
数据库管理
你可以在一个大型的数据库中放入任何表。不过时间长了,将会令数据库变得越来越大,服务器可能会跟不上io的工作,或者没有足够的内存应付所有的访问?要分开现有的数据又非常难。明智的办法是开始时就使用分开的数据库,并且进行有效的数据库管理。 如果你有一个卖书的网站,你可能有作者的列表,书价的列表,还有当前的库存和订单的列表。当你的业务不断增长时,订单将会不断地增长,而且处理每个订单都需要进行很多的磁盘访问。很可能你将在某一天将所有的订单都放到一个会计系统中。
现在就将订单放到一个独立的数据库吧。由于库存也是通过订单更新的,因此库存量也放到同样的数据库中。
作者的列表和书的列表都是一些静态的信息,要经常读取,但很少更新。实际上,更新一个作者的记录可能只需要每5年一次,只在作者写了一本新书(或者去世)时进行。放这些数据的服务器的配置可与放订单数据库的服务器完全不同。
包含phplib
phplib通过一个称为db_sql的类访问sql数据库。根据你需要使用的数据库类型,将不同的inc文件包含在你的代码中。在这个例子中,我使用mysql的版本。
为了在你的代码中使用db_sql,要将phplib文件安装在它们自己的目录中。然后,找到你的cgi-bin目录,并且在cgi-bin的目录旁创建phplib目录。下一步,拷贝所有的phplib .inc文件到phplib目录。最后,修改php.inc文件,只要将“include_path=”的行改为该phplib目录就可以了。
include_path是php使用include()或者require()时查找的目录,在我的nt workstation中,include的路径是:
include_path = .;i:/project52/includes;i:/project52/phplib;
在linux的系统上
include_path = .;/home/httpd/includes;/home/httpd/phplib;
在每个php页面的顶部加入
require(common.php);
?>
common.php3放在includes目录中,包含了每个页面要用到的所有数据和函数。在这个例子中的common.php是:
require(db_mysql.inc);
require(ct_sql.inc);
require(session.inc);
require(auth.inc);
require(perm.inc);
require(user.inc);
require(page.inc);
?>
如果你想知道每个inc文件的用处,可阅读http://phplib.netuse.de上的phplib文档。db_mysql.inc包含了所有db_sql类的定义。如果你想使用postgresql代替mysql,只要用db_pgsql.inc代替db_mysql.inc就可以了。还有10个其它的.inc文件,可以使用ms sql、oracle、sybase或者其它的数据库。
要注意的是,在这个例子中,require()和include()是完全一样的。不过,如果放在代码中,或者在if语句中使用时,require()和include的使用是完全不同的,并且有不同的运行结果。
扩展phplib
phplib通过一个db_sql类产生的对象来访问数据库。db_mysql.inc包含了为mysql修改过的db_sql类。我们将通过在common.php中加入代码来扩展db_sql,这些代码将加在包含db_mysql.inc的行后。
db_sql包含了很多用作查询的函数,我们要作修改的是:
/* public: 连接管理 */
function connect($database = , $host = , $user = , $password = ) {
/* 处理默认连接 */
if ( == $database)
$database = $this->database;
if ( == $host)
$host = $this->host;
if ( == $user)
$user = $this->user;
if ( == $password)
$password = $this->password;
/* 建立连接,选择数据库 */
if ( 0 == $this->link_id ) {
$this->link_id=mysql_pconnect($host, $user, $password);
if (!$this->link_id) {
$this->halt(pconnect($host, $user, $password) failed.);
return 0;
}
if (link_id>!@mysql_select_db($database,$this->link_id)) {
$this->halt(cannot use database .$this->database);
return 0;
}
}
return $this->link_id;
}
?>
在你的db_mysql.inc(或者其它数据库的相关.inc文件)中找到connect()函数,然后将它拷贝到common.php,放到包含db_mysql.inc代码的后面,在后面,还要将它封装为一个类的定义。
我发现这些代码有些难读,因此,首先令拷贝来的代码的可读性更好:
/* public: 连接管理*/
function connect($database = , $host = , $user = , $password = ) {
/* 处理默认连接 */
if ( == $database) {
$database = $this->database;
}
if ( == $host) {
$host = $this->host;
}
if ( == $user) {
$user = $this->user;
}
if ( == $password) {
$password = $this->password;
}
/* 建立连接,选择数据库 */
if ( 0 == $this->link_id ) {
$this->link_id=mysql_pconnect($host, $user, $password);
if (!$this->link_id) {
$this->halt(pconnect($host, $user, $password) failed.);
return 0;
}
if (link_id>!@mysql_select_db($database,$this->link_id)) {
$this->halt(cannot use database .$this->database);
return 0;
}
}
return $this->link_id;
}
?>
我调整了一下括号的位置,并且在单行的前后也加入了一个大括号。在php的if语句中,如果只有一句代码的话你可以不用括号,但是,如果你增加多一行代码,就会马上出错。因此我建议你加入一个括号,以免后来加入代码时出错。
在改变connect的代码之前,先要了解一下connect()是如何工作的,它检查当前是否存在一个连接,如果不存在连接的话,就创建一个连接。在每次的数据库查询之前,首先运行这个connect()函数。可惜的是,它只在首次连接的时候选择数据库,如果你的php页面使用超过一个数据库,connect()并不会选择另外的数据库。
要改变代码的话,有几种不同的方法。我们要选择一种对phplib的影响最小,而且可让我们在需要分析问题的时候,能够显示数据库连接状态的方法。我们需要在phplib外保存连接id和数据库的名字。只要在common.php加入:
$db_connection = 0; // 数据库连接的id
$db_database = ; // 当前数据库的状态
?>
下一步,我们要对phplib作修改,以便在这些变量中存储连接id和数据库的名字。在其它的代码中,你可以设置和使用同样的变量名。在分析问题时,如果你需要知道现在使用哪个数据库,只要在页面中插入以下的代码:
print( db_database: . $db_database . );
?>
我们怎样才能让connect()使用这些新变量呢?我们可以在顶部加入一行:
{
globals $db_connect, $db_database;
/* handle defaults */
?>
通过这些代码,新变量就可被connect()访问到
在定义了$db_database后,加入:
function db_connect($db_connect_host=, $db_connect_user=,$db_connect_pass=) {
globals $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
return($db_connect);
}
function db_database($db_database_new=) {
globals $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_database);
}
?>
只要定义这些公共的函数一次,你就可以在不同的地方使用这些公共的变量,而不需要加入global申明。以下就是使用上面db函数的公共函数:
function connect($database = , $host = , $user = , $password = ) {
/* 处理默认连接 */
if ( == $database) {
$database = $this->database;
}
if ( == $host) {
$host = $this->host;
}
if ( == $user) {
$user = $this->user;
}
if ( == $password) {
$password = $this->password;
}
/* 建立连接,选择数据库 */
if ( 0 == db_connect()) {
$this->link_id = db_connect($host, $user, $password);
if (!$this->link_id) {
$this->halt(pconnect($host, $user, $password) failed.);
return 0;
}
}
if (0 != db_connect()) {
if($database != db_database()) {
$this->database = db_database($database))
if(empty($this->database)) {
$this->halt(cannot use database . $this->database);
return 0;
}
}
}
return $this->link_id;
}
?>
留意以下改变:
对数据库的测试从连接的测试中分离出来,这样即使connect()有一个当前连接时,还可以检查是否要换成另外的数据库。这意味着与以前相比,db_connect()和0作比较的次数多了一倍,
http://www.bkjia.com/phpjc/486635.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/486635.htmltecharticlephplib是php的一些扩展库,使用它我们可以很方便地对数据库进行各种操作,不过,如果你要使用多个数据库的话,它就显得力不从心了,本...
