データ|データベース|データベース接続
データベースを扱うページがいくつかあるサイトがあるかもしれません。 PHPLIB を使用したいが、それに対応するために既存のデータベースを変更したくない場合があります。あなたの夢を実現するための答えがここにあります。 PHPLIB と複数のデータベース。
これを達成するには、PHPLIB を拡張する必要があります。この記事では、拡張機能の作成方法について説明します。この記事は、他の方法で PHPLIB を拡張するのに役立つことがわかります。この記事を読んだ後、PHPLIB が必要なことの 98% を達成できる状況について考えてください。
この記事で説明されている PHPLIB 拡張の提案は、PHPLIB 開発チームに提出されました。したがって、これらの拡張機能は将来のリリースで登場する可能性があります。 Web ページ内の他のコードは、データベース管理を整理するのに役立ちます。
データベース管理
すべてのテーブルを巨大なデータベースに配置できます。しかし、ある日それはあなたを刺すでしょう。データベースを管理することでトラウマを最小限に抑えることができます。データベースがサーバーに対して大きすぎる場合はどうなりますか?サーバーが IO スループットを処理できない場合、または処理するのに十分なメモリがない場合はどうなりますか?既存のデータベースを分割するのは困難ですが、別のデータベースから始めるのははるかに簡単で、適切なデータベース管理が役に立ちます。
書店を経営している場合は、おそらく著者のリスト、価格付きのタイトルのリスト、現在の在庫のリスト、注文のリストを持っているでしょう。ビジネスが成長するにつれて、注文リストも増大し、各注文が多くのディスク容量を占有するようになります。可能性の 1 つは、いつか金融システムに直接注文を入れるようになるということです。
今度は別のデータベースで注文を開始します。在庫数量は注文に応じて変化するため、在庫データは同じデータベースに配置されます。
著者リストと参考文献リストは静的な情報であり、よく読まれますが、変更されることはほとんどありません。実際、著者の記録に起こる唯一の変更は 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(auth.inc); です。 inc);
require(page.inc);
(http://phplib.netuse.de) も参照してください。何を含める必要があるかについては、http://www.phpbuilder.com を参照してください。 Db_mysql.inc には、DB_Sql クラスの定義が含まれています。 MySQL を PostGreSQL データベースに変換する場合は、db_mysql.inc を変更して db_pgsql.inc を含めます。そこには、MS SQL、Oracle、Sybase、およびその他のいくつかのデータベースをカバーする 10 の .inc ファイルがあります。
この例では、require() と include() がまったく同じであることに注意してください。 Require() と include() は動作が異なり、コードの途中または if() ステートメントで使用すると結果が異なります。
PHPLIB の拡張
PHPLIB 処理データベースは、DB_Sql クラスから作成されたオブジェクトを通じて実装されます。 Db_mysql.inc には、MySQL 用に変更された DB_Sql クラスが含まれています。 common.php3 の db_mysql.inc を含む行の直後にコードを追加して、DB_Sql を拡張します。
DB_Sql にはクエリ用の関数が多数含まれています。変更したいのは次のとおりです:
/* public: 接続管理*/
function connect($Database = "", $Host = "", $User = "", $Password = "") {
/* デフォルトの処理*/
if ("" == $Database)
$Database = $this->Database;
if ("" == $Host)
$Host = $this-> ;ホスト;
if ("" == $User)
$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) が失敗しました。");
return 0
}
if (!@mysql_select_db($Database,$this->Link_ID)) {
$this->halt("データベースは使用できません ".$this->Database);
return 0;
}
return $this->Link_ID; ?>
db_mysql.inc (またはデータベースの .inc ファイル) で connect() 関数を見つけて、db_mysql.inc インクルードの後の common.php3 にコピーします。この記事の最後で説明するように、これをクラス定義にカプセル化する必要があります。
そのコードは読みにくいと思いました。したがって、最初に行うことは、コピーしたコードを読み取り可能にすることです:
/* public: connection Management*/
function connect($Database = "", $Host = "", $User = "" , $パスワード = "") {
/* デフォルト処理*/
if ("" == $Database) {
$Database = $this->Database
}
if ("" == $ホスト) {
$Host = $this->ホスト
}
if ("" == $User) {
$User = $this->
}
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, $ユーザー、$Password) が失敗しました。");
return 0;
}
if (!@mysql_select_db($Database,$this->Link_ID)) {
$this->halt("は使用できませんデータベース ".$this->Database);
return 0;
}
}
return $this->Link_ID;
}
?>
このようにコードを短くします、囲まれたコードの場合、階層により括弧を一致させることができます。こうすることで、括弧の欠落などのエラーを回避できます。個々の行に括弧も追加しました。 PHP では、if ステートメントの後にコードが 1 行しかない場合、括弧を使用せずに実行できます。余分なコードを追加すると、この短縮法は失敗します。後でコードを追加するときにエラーを避けるために、常にかっこを追加することをお勧めします。
今度は、接続コードを変更します。 connect() コードがどのように接続の存在を検出し、接続が存在しない場合には接続を作成するかに注目してください。 connect() 関数は、すべてのデータベース クエリの前に呼び出されます。残念ながら、接続を作成するときにデータベースが選択されるのは 1 回だけです。 PHP ページが複数のデータベースを使用している場合、connect() コードはデータベースの変更を認識しません。
コードを変更するにはいくつかの方法があります。 PHPLIB への影響を最小限に抑え、問題を診断する必要があるときにアクティブなデータベースのステータスを表示できるようにする修正を探しています。 PHPLIB の外部で必要な 2 つの変数は、接続 ID とデータベース名です。したがって、これら 2 つの変数を PHPLIB の外部で表示できるようにします。 common.php3:
$db_connection = 0; // 共通データベース接続 ID
$db_database = ""; // 現在のデータベース名
?> 次に、接続 ID を保存するために PHPLIB を変更します。および データベース名がこれらのフィールドに入力されます。他のコードでも同じフィールドを設定して使用できます。問題を診断するときにどのデータベースが使用されているかを知る必要がある場合は、次のコードをページに挿入します:
Print("
db_database: " . $db_database . "
"); print ステートメントを記述するためのよりクリーンな方法があります。このメソッドは、カラー コード エディターで変数名を強調表示します。このメソッドは、配列やその他の複合変数名でも安定して動作します。)
新しい変数を使用する場合はどうすればよいですか?ヘッダーに追加の行を追加できます。
{
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-> ;ホスト;
}
if ("" == $User) {
$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($User, $Password) が失敗しました。"); }
if (0 != db_connect()) {
if($Database != db_database()) {
$this->Database = db_database($Database))
if(empty( $this- >データベース)) {
$this->halt("データベースを使用できません " . $this->データベース);
}
}
}
return $this-> ;Link_ID;
}
?>
次の小さな変更に注意してください:
接続テストが存在する場合でも、connect() が新しいデータベースを検出できるようにします。はすでに現在の接続です。これは、db_connect() と 0 を 2 回比較することを意味します。その結果、いくつかの小さな変更を加える価値があります。
データベース接続とデータベース選択を PHPLIB の外部に配置し、コード内でデータベース選択が必要な場合と同じ関数を使用できるようにします。
この場合、悪い点が 1 つだけあります。それは、すべてのデータベース操作で同じホスト、ユーザー、パスワードを想定していることです。特定のデータベースを処理するための特別な権限を持つユーザーとしてログインする場合は、この処理用の特別な接続を作成する必要があります。どうやってするの?変数を定義します:
$db_host = "";
$db_pass = ""; ) 関数、比較現在のユーザー名およびホスト名は、特別なユーザーおよびホストと同じです。
$db_type = "";
?>
そして、それを使用して、データベースの種類、MySQL、Oracleなどを保存します。複数のデータベース。
複数のデータベースを処理するようにコードを変更するのは、もう少し複雑です。結合関数と選択関数だけでなく、クエリ関数も変更する必要があります。 PHPLIB の ODBC オプションを使用した PHP の ODBC 接続についてお読みください。 ODBC は多くのデータベースを一般的な方法で処理できますが、速度が遅くなる場合があります。 ODBC を使用すると、複数の種類のデータベースで同じコードを使用できます。複数のデータベース タイプを使用する場合は、異なるデータ形式要件や異なるデータベース間の違いによる問題が発生する可能性があります。 ODBC は接続を簡素化しますが、データベースがデータと SQL を解釈する方法を改善するものではありません。
ここで、派生オブジェクト クラスに関する短いチュートリアルを始めます。 connect() 関数はクラス定義にカプセル化されています:
class DB_Sql {
}
?> この関数を common.php3 にコピーするときは、次のものが必要です。 DB_Sql クラスを派生します。 connect() をカプセル化することでこれを実装します。オブジェクトとクラスのコンテンツについては、を参照してください。 「extends」が何をするのか見てみましょう。最も最小限の言葉で言えば、派生で定義されたものはすべて、元の定義で定義されたものを置き換えるかオーバーライドします。
これでdb_DB_Sqlが使えるようになりました。 PHPLIB をインストールすると、次のように記述されたステートメントが作成されます:
$x = new DB_Sql?> これを次のように変更します。
$x = new db_DB_Sql;
?>
これは元のクラスの代わりに変更されたクラスを使用します。
これであなたはオブジェクト、クラス、OOP の専門家になり、年収 100 を求めることができます。 (外国人は十分勇気がある)
PHPLIB コードへの影響を最小限に抑えながら、効果的な変更を加えました。変更のトレースを記録して、新しいバージョンの PHPLIB で再利用できるようにします。データベース処理中にエラーが発生した場合は、外部関数に print ステートメントを挿入して、接続中に何が起こったかを確認できます。 PHPLIB コードを変更せずに、さらに多くのことを実行できるようになりました。
SQL が失敗したと思われる場合は、db_mysql.inc の DB_Sql から common.PHP3 の db_DB_Sql に qurey() 関数をコピーし、print ステートメントを挿入して SQL の使用状況を確認できます。
PHPLIBはCookieを記録します。 PHPLIB の途中にある print ステートメントにより、HTTP ヘッダー情報の出力に関するエラー メッセージが生成される場合があります。エラーは無視することも、診断情報をディスク ファイルに書き込むこともできます。
次のように始まります:
$db_log_file = "t:/diag.txt";
または、ディスク上のどこかにあるファイルを指すために使用される同様のステートメント。 Windows では、必ず既存のディレクトリを使用してください。そうしないと、奇妙なエラーが発生します
次に、次のように定義します。 a");
fwrite($db_log_f, date("Y m d H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
?>
何が起こったのかを確認する必要があるときは、次のようなログ メッセージを追加してください:
db_log("current database: " . db_database());ロギングテクノロジーとシステムロギングの分野。システム ログを使用する場合、正しいディレクトリを扱っていない可能性があるため、ほんの少しの情報を得るために大量のファイルを検索する必要がある場合があります。この分離されたログにより、テスト中にある程度の制御が可能になります。
db_log("現在のデータベース: " . db_database());
db_log(" 現在のデータベース: " . db_database(); );
?>
PHPLIB データベースにクエリを実行する必要がないように、データベース処理では必ず正しいデータベースを使用してください。データベース関数のラッパー関数を作成したり、使用する関数を変更したりすることもできます。 mysql_query() を使用する場合は、最初に db_database() を使用できます。
db_database("bookcatalogue");
$result = mysql_query("select * from?", db_connect());
$result = と置き換えることもできます。 mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
?>
function db_query($) db_query_database, $db _query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
?>
これで、PHPLIB (および類似のもの) を使用できるようになります。ソフトウェア) 複数のデータベースの操作
クラス/オブジェクトの展開
診断チェックの挿入
ログ情報のファイルへの書き込み
ログ ファイルが動作した後、逆の順序で実行し、次に診断チェック、次にクラスの展開を実行します。 、次に複数のデータベース
。