当前位置:编程学习 > php >>

PHPLIB 和多个数据库连接

答案:你可能有一个站点,有些页面要处理数据库。你可能想使用PHPLIB,但是不想为了适应它而改变现存的数据库。这儿给出实现你的梦想的答案。PHPLIB和多个数据库。

实现它需要对PHPLIB进行扩充。本文解释了如何创建扩充。你会发现,这篇文章会帮助你在其它方面对PHPLIB进行扩充。阅读完这篇文章后,思考一下PHPLIB可以完成你想要的98%的情况吧。

这篇文章所提及的PHPLIB的扩充的建议已经提交给了PHPLIB的开发组。因此,在未来的版本中,可能会出现这些扩充。在你的网页中的其它的代码将帮助你组织你的数据库管理。

数据库管理

你可以将每一个表放在一个巨大的数据库中。然而,总有一天会刺伤你。对数据库进行管理将会使创伤减小到最小。当你的数据库对一个服务器来说太大时会出现什么情况?当一个服务器不能处理IO吞吐量或者没有足够的内存进行处理又会怎么样?将现有的数据库进行拆分很难,但是从分离的数据库开始则容易多了,并且好的数据库管理会很有帮助。

如果你经营一家书店,你可能有作者列表,带有价格的书目列表,当前库存列表和订单列表。随着你的业务的发展,订单列表会增加,并且每一个订单会占用很多的磁盘空间。一种可能性就是有一天你会将订单直接放进财务系统。

现在开始将订单放在分离的数据库中。因为库存的数量是随着订单而变化的,所以将库存数据放在同一个数据库中。

作者列表和书目列表为一些静态信息,它们会经常被读到,但是很少改变。实际上,唯一的改变可能就是对于作者记录会每5年一次,这可能是当这个作者写了一本新书(或死亡了)。这些数据可能使用与订单数据库完全不同的配置。

包含PHPLIB

PHPLIB通过一个名为DB_Sql的类来操作SQL数据库。在你的代码中包含适合你的数据库的版本。在这个例子中,我使用MySQL版本。

为了在你的代码中得到DB_Sql,在PHPLIB要求的目录下安装PHPLIB文件。然后,找到你的cgi-bin目录,然后在cgi-bin目录下创建phplib目录。接着,拷贝所有的PHPLIB中的.inc文件到phplib目录下。最后,将phplib目录放在php.ini文件中include_path = 的那行上。

include_path是PHP引用在include()或require()中文件名的地方。在我的NT工作站上,包含路径是

include_path = ".;i:/project52/includes;i:/project52/phplib";

在Linux机器上,则为

include_path = ".;/home/httpd/includes;/home/httpd/phplib";

在每一个PHP页面的顶端为




require(common.php3);



?>



common.php3在包含目录中,包含对每一页都通用的所有的数据和函数。在common.php3中,为


require(db_mysql.inc);

require(ct_sql.inc);

require(session.inc);

require(auth.inc);

require(perm.inc);

require(user.inc);

require(page.inc);



?>



阅读PHPLIB文档(http://phplib.netuse.de),也可以在http://www.phpbuilder.com下查找一些好文章,来了解你需要包括些什么。Db_mysql.inc包含了DB_Sql类的定义。如果你想将MySQL改换成PostGreSQL数据库,将db_mysql.inc改成对db_pgsql.inc的包含。那里有10个.inc文件,涵盖了MS SQL,Oracle,Sybase和其它一些数据库。

请注意,在这个例子中,require()和include()是完全一样的。Require()和include()工作方式不同,当用在代码中间或在if()语句中时,结果是不一样的。

扩充PHPLIB

PHPLIB处理数据库是通过从DB_Sql类创建的一个对象实现的。Db_mysql.inc包含了DB_Sql类,为MySQL 进行了修改。我们将通过向common.php3添加代码来扩充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 (!@mysql_select_db($Database,$this->Link_ID)) {

$this->halt("cannot use database ".$this->Database);

return 0;

}

}

return $this->Link_ID;

}

?>

在你的db_mysql.inc中找到connnect()函数(或针对你的数据库的.inc文件),然后将其拷贝到common.php3中,在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 (!@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和数据库名称。因此,使这两个变量对PHPLIB外部可见。在common.php3:


$db_connection = 0; // 普通数据库连接id

$db_database = ""; // 当前数据库名字

?>


接着,我们修改PHPLIB来保存连接id和数据库名字在这些字段中。你的其它的代码可以设置和使用同一字段。如果你需要在诊断问题时知道哪一个数据库正在使用,在你的页面中插入这些代码:


Print("
db_database: " . $db_database . "

");

?>

(有一些更简洁的方法来书写打印语句。这个方法可以在彩色代码编辑器中加亮变量名。这个方法对于数组和其它复合变量名工作也很稳定。)

我们如何让connect()来使用新的变量呢?我们可在项部加入额外的行,所以你可以:


{

globals $db_connect, $db_database;

/* 缺省处理 */



?>

这行使我们的外部变量在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);

}



?>


通过定义这些通用函数一次,你可以在各种地方得到通用变量,不需要在所有地方增加全局行。这儿就是使用了我们的db函数的通用函数:


function connect($Database = "", $Host = "", $Use

上一个:mysql中的临时表
下一个:如何实现MySQL中的用户管理

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,