| PEAR DBクラスの使い方 |
| PEAR DBクラスの使い方 (PHP4からPostgreSQLを利用する方法とヨタwith勘違い) |
|
|
|
■ 目次 はじめに:PHPからDBを使う Pearとは Pearの取得方法 Pear DBクラスライブラリ クラス概要 クラスリファレンス DB クラス DB_common クラス DB_pgsql クラス DB_result クラス エラーコード表 使用方法:サンプル #01.データベースへの接続/切断 #01.B.PostgreSQLへの接続/切断 (ネイティブ関数版) #02.テーブル作成 #03.テーブルへのレコードの追加の表示 レンタルサーバーでPearを使う場合(例外的な) PHPについて/メモ PHPに関するリンク 参考資料(情報源) 更新履歴 このドキュメントについて問い合わせ/連絡先 PHP掲示板 (ご意見、間違いの指摘はこちらへお願いします) |
| テキスト版はこちら | |
● はじめに:PHPからDBを使うPostgreSQLが使えるレンタルサーバに移ったので、早速PHPから使ってみようと思いましたが、生の関数をそのまま使うのも面倒です。そこで、DBアクセスクラスを作ろうと思いましたが、どうせ世の中にあるものをまた作るのも間抜けなので既存のクラスを利用することにしました。 ・PHPLib はどうかな? PHP3のころから便利なライブラリとして、PHPLibというのが広く使われています。 セッションやDBアクセスを管理するクラスライブラリです。
・でも PHP4には Pear というものがあるのですよ。 ● PearとはPearライブラリは、マニュアル(http://www.php.net/manual/ja/pear.php)によると「PEAR は、TeXの CTAN および Perlの CPANにヒントを得たPHP拡張および PHPライブラリのコード用のコードレポジトリです。 」 とのことで、これからはPHPのライブラリはPearを元に拡充しようということだと思います。 Pearについては、PHPのマニュアルの一部になっていますし、PHPの方針としてはこれからはPearに違いないに違いないはずなので、Pearを使いましょう。そうしましょう。 しかしながら、いまのところPearの利用実績はあまりないようで、情報がいまいちありません。 特に国内ではPearに関する解説サイトが見つかりませんでした。(僕が調べた限りなのあてになりませんが) 公式サイトのマニュアルについてもPear全体についてのコーディング規約などは載っていますが、各クラスのリファレンスは載っていません。 どうしたものでしょう。 もっともPearのコーディング規約で、ソースコードのコメントは「phpDoc」形式で書くことになっています。 phpDocはjavaDocのようなものでコメントからマニュアルを生成してくれます。
しかしながらphpDocでマニュアルにコンバートしたドキュメントがどこにもないのはどうしたことでしょう?(これも探し方が悪いだけかも) どちらにしても日本語でまとまった情報がないようなので、Pearを使って行くうちに分かったことを少しずつまとめていきたいと思います。 まずはDB関連からです。 なんとなく人柱 (PHP,PostgreSQLについてあまり経験はありませんので、おそらく、相当の間違いが含まれていると思われます。お気づきの点はご指摘下さい) ● Pearの取得方法Pearは、PHP4がインストールされていれば一緒に入っているはずです。デフォルトでは「include_path」で指定されているディレクトリ「/usr/local/lib/php/」にあるようです。 最新版は、CVSで取得するか、公式サイトからPHPのソースをダウンロードしてきて「pear」ディレクトリ以下を丸ごとコピーすればよいと思われます(自信なし)。
● Pear DBクラスライブラリデータベースを操作するには、DBクラスを利用します。DBクラスは、PHPからSQLの各種RDBMSを統一されたインターフェースでアクセス出来るように設計されています。 だいたい次のような処理をサポートしています。
このドキュメントでは主にPostgreSQLの利用を前提にしています。 ● クラス概要┌─────┐ │DB │ └─────┘DBへのコネクションを処理します。 接続時にDBへのインターフェースクラス(query interface = DB_???)のインスタンスを生成します。 (DSN文字列に含まれている、DB種類指定をもとに生成するクラスを決定する) あとは、DSN文字列の解析(parse)や、エラーメッセージ処理などを受け持っています。 ┌─────┐ │DB_common │ └┬────┘ │┌─────┐ ├┤DB_pgsql │ │└─────┘ │┌─────┐ ├┤DB_mysql │ │└─────┘ │ :DBへのインターフェースクラス(query interface) DB_Commonから派生しているクラスが、各DB毎の固有の処理を行っています。 これらのクラスは、ユーザーは直接インスタンスを生成せずに、DBクラスのconnectメソッドにより生成します。(指定したDBのクラスのインスタンスが生成されます。たとえば、「pgsql」を指定した場合は、DB_pgsqlクラスのインスタンスが生成されます) クエリーの実行などは、このクラスに対しておこないます。 クエリーの実行結果は、レコードセットクラス(DB_result)として取得できます。 ┌─────┐ │DB_result │ └─────┘クエリーの結果(レコードセット)を保持します。 レコード内容を取得できます。 レコードのフィールド定義情報、レコード数などの取得も出来ます。
┌─────┐
│PEAR_Error│
└┬────┘
│┌─────┐
├┤DB_Error │
│└─────┘
│┌─────┐
└┤DB_Warning│
└─────┘
DBクラス内で発生したエラー・ワーニングを保持します。DBクラスでエラーが発生した場合は、戻り値としてDB_Errorクラスのインスタンスが返ります。 戻り値がエラーであるかどうかは、DB::isErrorメソッドで確認できます。 ワーニングの場合も同様です。 エラー処理については、Pearのエラー処理規約に準拠しているようなので、マニュアル参照(http://www.php.net/manual/ja/class.pear-error.php)。 ● クラスリファレンス対象バージョン: PHP 4.0.5 (Pear ver.2)凡例: 「▼」ユーザーが直接利用するメンバ 「▽」クラス内部で利用されるメンバ (またはユーザーが直接利用するものもあるかもしれないが頻度が低そうなもの) ■ DB クラスDBへのコネクションを処理する。インターフェースクラスのインスタンスを生成するのが主な役割。 DBクラスのインスタンスは生成する必要はない。メンバー関数は全てスタティック 【メンバー変数】
データベースへ接続する
$dsnで指定されたデータソース名を元にインターフェースクラスを生成し、データベースへ接続する。 $dsnは、DSN文字列、または、項目毎の要素を持つArrayを指定できる。 a) DSN文字列のフォーマットは次の通り(ソースからコピー)
phptype://username:password phptype://username:password phptype://username@hostspec phptype://hostspec/database phptype://hostspec phptype(dbsyntax) phptype 例) pgsql://fukaya:password pgsql://fukaya:password b) dsnをArrayで指定する場合の要素は次の通り
▼ apiVersion() APIバージョンを返す
▼ isError($value) 指定された変数がエラークラスであるか判定する
DBクラス群のメンバ関数からの戻り値がエラークラス(DB_Error)であるか判定する。 メンバ関数からの戻り値は、まずこのメソッドでエラー値であるか判定すること。 ▼ isWarning($value) 指定された変数がワーニングクラスであるか判定する
DBクラス群のメンバ関数からの戻り値がワーニングクラス(DB_Warning)であるか判定する。 メンバ関数からの戻り値は、まずこのメソッドでエラー値であるか判定すること。 ▼ errorMessage($value) エラーコードに対応するエラーメッセージ文字列を返す
▽ isManip($query) SQL文が、DML(データ操作言語)であるか判定する
SQL文が、DML(データ操作言語)であるか判定する。 DML(Data Manipulation Language)とはデータを操作するステートメントのことです(INSERT,UPDATE,DELETE,REPLACEなど)。 ▽ &factory($type) インターフェースクラスインターフェースを生成する
DSNで指定されたDB名を元に、適切なインターフェースクラスを生成して返すクラスファクトリー。 たとえば、$typeに「pgsql」を渡された場合は、DB_pgsqlクラスのインスタンスを返す。 クラス内部から利用されるユーザーが直接使用することは無い(connect関数から利用される)。 DSN文字列を解析する
$dsnで渡されたDSN文字列を解析して返す。 引数、戻り値の形式は、connectメンバ関数の a)、b) を参照 ■ DB_common クラスDBへのインターフェースクラスのベースクラス。各DBの固有部分を実装したクラス(DB_pgsqlクラスなど)に派生して利用し、直接は使用しない。 DB_pgsqlクラスでオーバーライドされているメンバは、メソッド名の右に「*」を表記した。 機能が実装されていないメソッド(DB_ERROR_NOT_CAPABLEエラーになる)は、メソッド名の右に「x」を表記した。(変な表記なので後で直す) ※ DBへの接続を終了する場合は、disconnect()メソッドを使用するが、DB_commonには存在せず、派生先のクラスにのみ存在する 【メンバー変数】
var $errorcode_map; var $type; var $prepare_tokens; var $prepare_types; var $prepare_maxstmt; var $error_mode = PEAR_ERROR_RETURN; var $error_level = E_USER_NOTICE; var $error_callback; var $last_query = ''; var $fetchmode = DB_FETCHMODE_ORDERED; var $options = array( 'persistent' => false, // persistent connection? 'optimize' => 'performance', // 'performance' or 'portability' ); var $dbh; // 選択されたインターフェースクラス(DB_pgsql等) 【メンバー関数】
コンストラクタ ▽ toString() 接続状態を文字列で返す
▽ quoteString($string) SQL文の「'」を「\'」に置換する
▽ provides($feature) DBの機能のインプリメント状況を取得する
機能名
▽ errorCode($nativecode) PHPのDB操作関数からのエラーコード(ネイティブ)を、DBクラスでのエラーコードに変換する
▽ errorMessage($dbcode) PHPのDB操作関数からのエラーコード(ネイティブ)から、DBクラスでのエラーメッセージ(文字列)を返す
▽ &raiseError($code = DB_ERROR, $mode = false, $level = false, $debuginfo = false, $nativecode = false) エラーを発生させる ▽ setErrorHandling($mode, $options = false) エラーハンドリングを設定 ▼ setFetchMode($fetchmode) デフォルトでのフェッチモードを指定
フェッチモードを指定する。 フェッチモードとは FetchRow() でレコード内のフィールドを配列で取得したときの、各要素へのアクセス方法 フェッチモード
▼ setOption($option, $value) オプション値を設定する
項目名
▼ getOption($option) オプション設定値を取得する
▼ prepare($query) *x クエリーの連続(複数?)実行する際のクエリーを設定する
?よくわからない。ストアドクエリーのようなもの? 「this is emulated.」と書いてあるので、使う必要なないのか? ▼ execute($stmt, $data = false) *x prepareで設定されたクエリーを実行する
▼ executeEmulateQuery($stmt, $data = false) prepareで設定されたクエリーを実行する
▼ executeMultiple( $stmt, &$data ) prepareで設定されたクエリーを実行する
▽ modifyQuery($query) ネイティブのDBへ渡すためにSQLを修正する
いまのところ内部ではなにもしていない ▼ &query($query) * クエリー実行
クエリーを実行して結果(ResultSet)を取得する。 ResultSetは、DB_resultクラスとして返る。 レコードの中身を取得するのは、DB_resultクラスのメンバ関数を利用する。 一番基本的で重要なメソッド ▼ &getOne($query, $params = array()) ▼ &getRow($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array()) ▼ &getCol($query, $col = 0, $params = array()) ▼ &getAssoc($query, $force_array = false, $params = array()) ▼ &getAll($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array())
DB_resultを介さないで済むので楽かも。 ▼ autoCommit($onoff=false) x* オートコミットの設定
デフォルトでは、ONです。 ▼ commit() x* トランザクションをコミットする ▼ rollback() x* トランザクションをロールバックする ▼ numRows($result) x* 指定ResultSetの行数を取得する
▼ affectedRows() x* 変更された行数を取得する
▼ errorNative() x* ネイティブのエラーコードを返す
▼ nextId($seq_name, $ondemand = true) x* シーケンスの次の値を取得する
▼ createSequence($seq_name) x* シーケンスを作成する
▼ dropSequence($seq_name) x* シーケンスを削除する
■ DB_pgsql クラスDB_commonの派生クラス。DB_commonのメソッドをオーバーライドしてPostgreSQL依存の部分を実装しています。 メンバー関数は、DB_pgsql独自のもののみ記載。 引数に$resultがあるメソッドは、DB_resultクラスから利用される。(引数の意味はほとんど同じので、DB_resultの説明を参照して下さい) 【メンバー変数】
var $phptype, $dbsyntax; var $prepare_tokens = array(); var $prepare_types = array(); var $transaction_opcount = 0; var $numrows; var $row; var $affected; var $autocommit = true; var $dsn; 【メンバー関数】
コンストラクタ ▽ connect($dsn, $persistent = false) DBへ接続する
DSNを元にDBへ接続する。 DSNについては、DB::connectの説明を参照。 DBクラスから呼ばれる。 ▼ disconnect() DBへの接続を終了する
▽ simpleQuery($query) クエリーを実行する
▽ errorCode($errormsg) DBネイティブのエラーメッセージをDBクラスのエラーコードに変換
▽ &fetchRow($result, $fetchmode = DB_FETCHMODE_DEFAULT) ▽ fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT) ▽ freeResult($result) ▽ numCols($result) ▽ numRows($result) ▽ errorNative() ネイティブのエラーメッセージを取得する
■ DB_result クラスクエリー実行結果のRecordSetを保持するクラス【メンバー変数】
var $result; ネイティブのResultSetハンドル
コンストラクタ
DB_common::queryメソッド実行時の戻り値として、インスタンスが生成される際に呼ばれる。 ▼ fetchRow($fetchmode = DB_FETCHMODE_DEFAULT) 現在行を取得する
現在参照している行(レコード)のフィールド値を配列(Array)として返す。 フェッチモードにより配列のアクセス方法を指定できる。 フェッチモード
▼ fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT) 現在行を取得する(引数で渡した配列に読み込む)
現在参照している行(レコード)のフィールド値を指定した既存の配列(Array)に返す。 フェッチモードにより配列のアクセス方法を指定できる。 ▼ numCols() レコードの列数(フィールド数)を取得する
▼ numRows() レコードの行数(レコード数)を取得する
▼ free() RecordSetを開放する
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <?php i18n_http_output("SJIS");
?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>DB Exsample #01 : Connect</title> </HEAD> <BODY> <H2>DB Exsample #01 : Connect</H2> PostgreSQLへの接続/切断を行います。<BR> Pear DBクラスライブラリを使用します。<BR> <BR> <?php // ● 変数セット // エラーチェック // ● DB接続終了 </BODY> |
| <?php i18n_http_output("SJIS");
?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>DB Exsample #01B : Connect</title> </HEAD> <BODY> <H2>DB Exsample #01B : Connect</H2> PostgreSQLへの接続/切断を行います。<BR> PostgreSQLネイティブ関数を使用します。<BR> <BR> <?php // ● DBへ接続 // エラーチェック // ● DB接続終了 </BODY> |
| フィールド | 型 | 説明 |
| f_date | varchar(20) | アクセス日 YYYY/MM/DD HH:MM:SS |
| f_ipadr | varchar(16) | IPアドレス ###.###.###.### |
| <?php i18n_http_output("SJIS");
?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>DB Exsample #02 : Create Table</title> </HEAD> <BODY> <H2>DB Exsample #02 : Create Table</H2> PostgreSQLのデータベースにテーブルを作成します。<BR> Pear DBクラスライブラリを使用します。<BR> <BR> <?php // ● 変数セット // エラーチェック // ● テーブル作成 // クエリー実行 // エラーチェック // ● DB接続終了 </BODY> |
| <?php i18n_http_output("SJIS");
?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>DB Exsample #03 : Insert & Select</title> </HEAD> <BODY> <H2>DB Exsample #03 : Insert & Select</H2> テーブルをレコードを追加し内容を表示します。<BR> Pear DBクラスライブラリを使用します。<BR> <BR> <?php // ● 変数セット // エラーチェック // ● レコード追加 // エラー処理 (なんか常に DB_OKなような気がする) // ● レコード内容表示 // エラー処理 (どうやってもDB::isErrorがtrueにならないなあ) // 取得したResultSet内容を表示 // ● DB接続終了 </BODY> |
require_once 'DB.php';
ini_set("include_path",ini_get("include_path"));ini_set("include_path", ".:./pear" );Date Ver. Description ---------- ---- ----------------------------- 2001/06/10 0.01 公開 2001/06/16 0.02 HTML版公開
|
Copyright (c) 2001 Dokokano
Labo. and FUKAYA Takashi All rights reserved.
|