- Home ›
- PEAR入門 ›
- データベース接続(PEAR::DB) ›
- HERE
データベースへ接続
まずデータベースへの接続方法です。DBクラスで用意されているconnectメソッドを使います。
connect object connect (mixed $dsn [, array $options = array()])
新しい DB 接続オブジェクトを作成し、指定したデータベースに接続します。 パラメータ string あるいは array $dsn データソース名。 array $options オプションの引数に、このパッケージのための実行時設 定項目を 含めることができます。 返り値 object - 新しい DB オブジェクト、 あるいは失敗時には DB_Error オブ ジェクトを返します。
データベースへ接続するための情報をDSN(データソース名)の形で指定します。指定は文字列でまとめて指定するか、配列の形で指定します。
DSNの形式
DSNのフォーマットは下記の通りです。
phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value
各項目の意味は下記の通りです。
phptype : PHP で使用されるデータベースバックエンドです (すなわち mysql や odbc 等)。 dbsyntax : SQL 構文等のデータベース関連構文です。 phptype として ODBC を使用する場合、ODBC ドライバが接続している DBMS タイプにこれをセットしてください。 例: access・ db2・mssql・ navision・solid・その他 protocol : 使用する通信プロトコルです (すなわち、tcp・unix 等)。 hostspec : ホストの指定です (hostname[:port])。 database : DBMS サーバ上のデータベース使用方法です。 username : ログイン用ユーザ名です。 password : ログイン用のパスワードです。 proto_opts: protocol で使用されるオプションです。
phptype
phptypeには接続するデータベースを表す文字列を指定します。現在サポートされているのは下記の通りです。
dbase -> dBase fbsql -> FrontBase (DB 1.7.0 以降) ibase -> InterBase (DB 1.7.0 以降) ifx -> Informix msql -> Mini SQL (DB 1.7.0 以降) mssql -> Microsoft SQL Server mysql -> MySQL (MySQL <= 4.0 用) mysqli -> MySQL (MySQL >= 4.1 用) (PHP 5 以降) (DB 1.6.3 以降) oci8 -> Oracle 7/8/9 odbc -> ODBC (Open Database Connectivity) pgsql -> PostgreSQL sqlite -> SQLite sybase -> Sybase
例えばMySQLやPostgreSQL、SQLiteに接続する場合は下記のようになります。
mysqli://username:password@protocol+hostspec/database pgsql://username:password@protocol+hostspec/database
※「mysqli」とする場合はMySQL4.1以降でPHP5以降の場合です。そうでない場合は「mysql」として下さい。
username & password
次に接続するユーザー名とパスワードです。例えばユーザー名が「testuser」、パスワードが「pass」だった場合には下記のようになります。
mysqli://testuser:pass@protocol+hostspec/database pgsql://testuser:pass@protocol+hostspec/database
SQLiteのようにユーザー名が無い場合は省略して構いません。
sqlite://@protocol+hostspec/database
protocol & hostspec
プロトコルは使用する通信プロトコルです。TCPやUNIX接続などになります。hostspecはホスト名です。プロトコルはWindows環境でサービスとして動かしているデータベースに接続するのであれば省略しても構わないと思います。ホスト名はホスト名とポート番号(省略可能)で指定します。
mysqli://testuser:pass@localhost/database pgsql://testuser:pass@localhost:5432/database
database
databaseにはデータベース名を指定します。データベース名を「testdb」とした場合は下記のような感じです。
mysqli://testuser:pass@localhost/testdb pgsql://testuser:pass@localhost:5432/testdb
またSQLiteなどの場合にはデータベースの位置まで含めて指定します。
sqlite:///d:¥sqlite¥testdb
このようにして作成したDSNを表す文字列をconnectメソッドの引数に指定して接続します。
$dsn = 'mysqli://testuser:pass@localhost/testdb'; $db = DB::connect($dsn);
なお、ユーザー名とパスワードにDSNを記述する上で区切り文字として使われている文字(/や@など)が含まれている場合はURI エンコーディング方式でエスケープする必要があります。
: = %3a / = %2f @ = %40 + = %2b ( = %28 ) = %29 ? = %3f = = %3d & = %26
配列で指定
先ほどはパラメータを1つの文字列にまとめていましたが、各パラメータの値を配列の形で設定し、その配列の値をconnectメソッドの引数として指定することも可能です。プログラムは長くなりますけど、1つ1つのパラメータの値を個別に指定できますので間違いが少ないかもしれません。
ベースになる配列は下記を使います。
$dsn = array( 'phptype' => false, 'dbsyntax' => false, 'username' => false, 'password' => false, 'protocol' => false, 'hostspec' => false, 'port' => false, 'socket' => false, 'database' => false );
例えばMySQLへ接続する場合は下記のような感じです。
$dsn = array( 'phptype' => 'mysqli', 'username' => 'testuser', 'password' => 'pass', 'hostspec' => 'localhost', 'database' => 'testdb' ); $db = DB::connect($dsn);
接続のエラー確認
connectメソッドを実行した結果、成功した場合には返り値にDBオブジェクトを返してくれますが、失敗した場合にはDB_Errorオブジェクトを返してきます。
その為、connectメソッド実行直後に、connectメソッドからの返り値がDB_Errorオブジェクトかどうかを調べることで接続に成功したか失敗したかを判別できます。このDB_Errorオブジェクトかどうかを調べるためにDBクラスでisErrorメソッドが用意されています。ただそのメソッドの解説にはDBクラスのisErrorメソッドではなく、PEARクラスで用意されているisErrorメソッドを使うことを推奨されたました。
isError boolean PEAR::isError (mixed $data [, mixed $msgcode])
isError() は、ある変数が PEAR_Error オブジェクトかどうかを調べます。 オプションで、特定のエラーメッセージ またはエラーコードが含まれて いるかどうかを調べます。 パラメータ mixed $datan チェックする変数 mixed $msgcode チェックするエラーメッセージまたはエラーコード(オ プション)。 返り値 変数が、PEAR_Error の場合に TRUEを返します。 第2引数が設定された場 合は、さらに 所与された $msgcode を含む場合のみ TRUEを返します。
is_Errorメソッドで判別した結果、PEAR_Errorオブジェクトだった場合、このオブジェクトからエラーメッセージを取り出すことができます。PEAR_Errorクラスで用意されているgetMessageメソッドを使います。
getMessage string PEAR_Error::getMessage ()
エラーオブジェクトが保持するエラーメッセージを返します。 返り値 エラーメッセージ
こららを使ってデータベースへの接続は下記のように記述します。
$dsn = 'mysqli://testuser:pass@localhost/testdb'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); }
( Written by Tatsuo Ikura )