ホームページ >バックエンド開発 >PHPチュートリアル >PHPLIB_PHP チュートリアルを使用して複数のデータベースにアクセスする

PHPLIB_PHP チュートリアルを使用して複数のデータベースにアクセスする

WBOY
WBOYオリジナル
2016-07-13 17:36:31820ブラウズ

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页面的顶部加入
<?php
require(common.php);
?>
common.php3放在includes目录中,包含了每个页面要用到的所有数据和函数。在这个例子中的common.php是:
<?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包含了很多用作查询的函数,我们要作修改的是:

<?php
/* 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代码的后面,在后面,还要将它封装为一个类的定义。

コードが少し読みにくいと感じたので、まずコピーしたコードを読みやすくしました:

php
/* 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;
}
/* 接続を確立し、選択Database*/
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) が失敗しました。");
return 0;
}
if (Link_ID">!@mysql_select_db($Database,$this->Link_ID) ) {
$this->halt("データベース ".$this->Database は使用できません);
return 0;
}
}
return $this->Link_ID;
}
>

括弧の位置を調整し、単線の前後に括弧を追加しました。 PHPのif文では、コードが1行だけであれば括弧は必要ありませんが、もう1行コードを追加するとすぐにエラーが発生します。したがって、後でコードを追加するときにエラーを避けるために括弧を追加することをお勧めします。

connect コードを変更する前に、まず connect() がどのように動作するかを理解する必要があります。接続が現在存在するかどうかを確認し、存在しない場合は接続を作成します。各データベース クエリの前に、まずこの connect() 関数を実行します。残念ながら、PHP ページで複数のデータベースが使用されている場合、connect() は最初の接続時にのみデータベースを選択します。

コードを変更するにはいくつかの方法があります。 PHPLIB への影響を最小限に抑え、問題を分析する必要があるときにデータベース接続ステータスを表示できる方法を選択する必要があります。接続 ID とデータベース名を PHPLIB の外部に保存する必要があります。 common.php に追加するだけです:

php
$db_connection = 0; // データベース接続 ID
$db_database = ""; // 現在のデータベースのステータス
? >

次に、これらの変数に接続 ID とデータベース名を格納するように PHPLIB を変更する必要があります。同じ変数名を他のコードで設定して使用することができます。問題を分析するときに、どのデータベースが使用されているかを知る必要がある場合は、次のコードをページに挿入するだけです:

php
Print(" db_database: " . $db_database . "");
? >

connect() でこれらの新しい変数を使用するにはどうすればよいですか?上部に行を追加できます:

php
{
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="") {
グローバル $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 = "", $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) が失敗しました。");
return 0;
}
}
if (0 != db_connect()) {
if($Database != db_database()) {
$this->Database = db_database($Database))
if(empty($this->Database)) {
$this->halt("データベースを使用できません " . $this->Database);
return 0;
}
}
}
$this->Link_ID;
}
を返しますか? >

次の変更点に注意してください:

データベースのテストは接続のテストから分離されているため、connect()で現在の接続がある場合でも、別のデータベースに変更するかどうかを確認できます。これは、db_connect() が以前の 2 倍の回数 0 と比較することを意味します

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/486635.html技術記事 PHPLIB は PHP の拡張ライブラリです。これを使用すると、データベースに対してさまざまな操作を簡単に実行できます。ただし、複数のデータベースを使用したい場合は、これは不可能です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。