PHPLIB は PHP の拡張ライブラリであり、これを使用するとデータベースに対してさまざまな操作を簡単に実行できます。ただし、この記事では、PHPLIB を拡張して使用できるようにする方法を紹介します。 PHPLIB を使用しながら複数のデータベースを使用でき、オブジェクト指向プログラミングとライブラリの拡張方法についても学ぶことができます。
データベース管理
任意のテーブルを大規模なデータベースに配置できます。しかし、時間の経過とともに、データベースはますます大きくなり、サーバーが IO 作業に対応できなくなったり、すべてのアクセスに対処するのに十分なメモリが不足したりする可能性があります。既存のデータを分離するのは非常に困難です。別々のデータベースから始めて、効率的なデータベース管理を実装することが賢明です。 書籍を販売する Web サイトをお持ちの場合は、著者のリスト、本の価格のリスト、現在の在庫と注文のリストがあるでしょう。ビジネスが成長するにつれて注文も増え続け、各注文を処理するには大量のディスク アクセスが必要になります。おそらく、ある時点ですべての注文を会計システムに入力することになるでしょう。
次に、注文を別のデータベースに保存します。在庫は注文によっても更新されるため、在庫数量も同じデータベースに配置されます。
著者のリストと書籍のリストは、頻繁に読む必要がある静的な情報ですが、更新されることはほとんどありません。実際には、著者の記録を更新する必要があるのは 5 年に 1 回、著者が新しい本を書いたとき (または亡くなったとき) だけです。このデータをホストするサーバーは、注文データベースをホストするサーバーとはまったく異なる構成にすることができます。
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 は、include() または require() を使用するときに PHP が検索するディレクトリです。Linux では、include_path
=
".;i:/project52/includes;i:/project52/phplib"; となります。
システムで、
各 PHP ページの上部に
include_path = ".;/home/httpd/includes;/home/httpd/phplib";
を追加します。
<? php
require(common.php);
? >
common.php3 は include ディレクトリに配置され、各ページで使用されるすべてのデータと関数が含まれています。この例では、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 クラスの定義が含まれています。 MySQL の代わりに PostGreSQL を使用する場合は、db_mysql.inc の代わりに db_pgsql.inc を使用してください。 MS SQL、Oracle、Sybase、またはその他のデータベースで使用するための .inc ファイルが他に 10 個あります。
この例では、require() と include() はまったく同じであることに注意してください。ただし、コードに配置する場合、または if ステートメントで使用する場合、Require() と include の使用はまったく異なり、実行結果も異なります。
PHPLIB の拡張
PHPLIB は、DB_Sql クラスによって生成されたオブジェクトを通じてデータベースにアクセスします。 Db_mysql.inc には、MySQL 用に変更された DB_Sql クラスが含まれています。 common.php の db_mysql.inc を含む行の後にコードを追加して、DB_sql を拡張します。
DB_Sql にはクエリ用の関数が多数含まれています。変更する必要があるのは
次のとおりです。 php
/* パブリック: 接続管理*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* デフォルトの接続を処理します */
if ("" == $Database)
$データベース = $this->データベース;
if ("" == $ホスト)
$ホスト = $this->ホスト;
if ("" == $User)
$ユーザー = $this->ユーザー;
if ("" == $パスワード)
$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) が失敗しました。");
0を返します。
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("データベースは使用できません ".$this->Database);
0を返します。
}
$this->Link_ID を返します
。
}
? >
db_mysql.inc (または他のデータベース関連の .inc ファイル) で connect() 関数を見つけて、それを common.php にコピーし、db_mysql.inc を含むコードの後ろに置きます。 最後に、次のコードも追加する必要があります。それはクラス定義としてカプセル化されます。
コードが少し読みにくいと感じたので、まずコピーしたコードを読みやすくしました
。 php
/* パブリック: 接続管理*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* デフォルトの接続を処理します */
if ("" == $Database) {
$データベース = $this->データベース;
}
if ("" == $Host) {
$ホスト = $this->ホスト;
}
if ("" == $User) {
$ユーザー = $this->ユーザー;
}
if ("" == $Password) {
$Password = $this->パスワード;
}
/* 接続を確立し、データベースを選択します */
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) が失敗しました。");
0を返します。
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("データベースは使用できません ".$this->Database);
0を返します。
}
}
$this->Link_ID を返す;
}
? >
括弧の位置を調整し、単線の前後に括弧を追加しました。 PHPのif文では、コードが1行だけであれば括弧は必要ありませんが、もう1行コードを追加するとすぐにエラーが発生します。したがって、後でコードを追加するときにエラーを避けるために括弧を追加することをお勧めします。
接続コードを変更する前に、まず 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
{
グローバル $db_connect、$db_database;
/* デフォルトを処理します */
? >
これらのコードを通じて、connect() によって新しい変数にアクセスできます。
$db_database を定義した後、以下を追加します。
<? php
function db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
グローバル $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user、$db_connect_pass);
}
戻り値($db_connect);
}
関数 db_database($db_database_new="") {
グローバル $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
戻り値($db_database);
}
? >
これらのパブリック関数を一度定義すれば、グローバル宣言を追加することなく、別の場所でこれらのパブリック変数を使用できます。上記の db 関数を使用するパブリック関数は次のとおりです
。 php
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* デフォルトの接続を処理します */
if ("" == $Database) {
$データベース = $this->データベース;
}
if ("" == $Host) {
$ホスト = $this->ホスト;
}
if ("" == $User) {
$ユーザー = $this->ユーザー;
}
if ("" == $Password) {
$Password = $this->パスワード;
}
/* 接続を確立し、データベースを選択します */
if (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) が失敗しました。");
0を返します。
}
}
if (0 != db_connect()) {
if($Database != db_database()) {
$this->データベース = db_database($Database))
if(empty($this->データベース)) {
$this->halt("データベースを使用できません " . $this->Database);
0を返します。
}
}
}
$this->Link_ID を返す;
}
? >
次の変更点に注意してください。
データベースのテストは接続のテストから分離されているため、connect() に現在の接続がある場合でも、別のデータベースに変更するかどうかを確認できます。これは、db_connect() が以前の 2 倍の頻度で 0 と比較することを意味しますが、この追加の処理が必要です。
データベース接続とデータベース選択は PHPLIB の外部に保持されるため、PHP コードのどこでも同じデータベース選択関数を使用できます。
ただし、現在の処理には制限があります。ここでは、すべてのデータベースで同じホスト、ユーザー、パスワードが使用されると仮定します。データベースにユーザーごとに異なる権限がある場合は、データベースにアクセスするための特別な接続を確立する必要があります。どうやって?次の変数を定義するだけです:
<? php
$db_host = "";
$db_user = "";
$db_pass = "";
? >
db_database() 関数を拡張することで、現在のユーザーおよびホストを特定のユーザーおよびホストと比較します。次のように追加することもできます。
<? php
$db_type = "";
? >
この変数は、データベースのタイプ (mysql または Oracle など) を保存するために使用されます。このようにして、複数のデータベースにアクセスできます。
しかし、複数の異なるタイプのデータベースを処理するためにコードを変更するのは非常に複雑です。結合関数と選択関数だけでなく、クエリ関数も変更する必要があります。 PHP の ODBC 経由で接続し、PHPLIB の ODBC オプションを使用して処理できる場合があります。 ODBC は複数のデータベースを共通の方法で処理するため、速度が遅くなります。 ODBC を使用すると、同じコードを使用して複数の異なるタイプのデータベースを処理できます。ただし、異なる処理形式の日付を使用する必要がある場合には問題が発生し、データベース間に奇妙な違いが生じることもあります。 ODBC は接続を簡素化するだけで、データベースがデータと SQL を解釈する方法を変更するものではありません。
次に、オブジェクト クラスを再定義する方法を学びましょう。 connect() 関数はクラス定義にカプセル化されます。
<? php
クラス DB_Sql {
}
? >
この関数を common.php にコピーするとき、DB_Sql クラスを再定義する必要があります。次のように connect() をカプセル化できます。
<? php
クラス db_DB_Sql は DB_Sql を拡張します {
}
? >
「extends」の仕組みについて詳しくは、PHP ドキュメントのオブジェクトとクラスに関するセクションを参照してください。簡単に言うと、拡張機能内の定義はすべて、以前の定義を置き換えてオーバーライドします。
db_DB_Sql が使用できるようになりました。 PHPLIB を構成するときは、次のステートメントを作成します
。 php
$x = 新しい DB_Sql;
? > 次のように変更します: <? php
$x = 新しい db_DB_Sql;
? >
このようにして、前のクラスの代わりに変更されたクラスを使用できます。
データベース接続時にエラーが発生した場合、現在の接続状態を外部関数で出力できます。 SQL ステートメントでエラーが発生した場合は、DB_Sql の query() 関数を common.PHP の db_DB_Sql にコピーし、出力ステートメントを挿入して現在の SQL ステートメントを確認することもできます。
エラーまたは診断情報をディスク ファイルに書き込むこともできます。
$db_log_file = "t:/diag.txt"
または同様のテキスト ファイル
を定義します
。Windows を使用している場合は、ディレクトリが存在することを確認する必要があります。存在しないと、エラー メッセージが表示されます。
次に、関数を定義します
。 php
関数 db_log($db_log_message) {
グローバル $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
情報を記録する必要がある場所に、次のコードを追加します。
<? php
db_log("現在のデータベース: " .db_database());
? >
実際には、組み込みまたはシステムのログ ファイルを使用できます。ただし、多くのファイルの中から小さな情報を見つけなければなりません。したがって、この別個のログ ファイルはテストに役立ちます。記録の前後に次のコードを記述することをお勧めします
。 php
db_log("現在のデータベース: " .db_database());
db_database("書籍カタログ");
db_log("現在のデータベース: " .db_database());
? >
データにアクセスするときは、PHPLIB で定義されたデータベースではなく、必ず正しいデータベースを使用してください。データベースのラッパー関数を作成したり、使用する関数を変更したりできます。 mysql_query() を使用する場合は、最初に db_database() を使用し、
<? php
$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
? > これは次の機能を提案します: <? php
関数 db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
?
<
の代わりに
>
?php
db_database("書籍カタログ");
$result = mysql_query("select * from?", db_connect());
?
PHPLIB (または同様のソフトウェア) を使用して複数のデータベースにアクセスできるように
なりまし
た
。
.extend クラス/オブジェクト
.診断テストを挿入
.ログファイルの作成