データベースへ接続

広告

まずデータベースへの接続方法です。DBクラスで用意されているconnectメソッドを使います。

新しい 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() は、ある変数が PEAR_Error オブジェクトかどうかを調べます。
オプションで、特定のエラーメッセージ またはエラーコードが含まれて
いるかどうかを調べます。

パラメータ
  mixed $datan  チェックする変数
  mixed $msgcode  チェックするエラーメッセージまたはエラーコード(オ
    プション)。
返り値
  変数が、PEAR_Error の場合に TRUEを返します。 第2引数が設定された場
    合は、さらに 所与された $msgcode を含む場合のみ TRUEを返します。

is_Errorメソッドで判別した結果、PEAR_Errorオブジェクトだった場合、このオブジェクトからエラーメッセージを取り出すことができます。PEAR_Errorクラスで用意されているgetMessageメソッドを使います。

エラーオブジェクトが保持するエラーメッセージを返します。

返り値
  エラーメッセージ

こららを使ってデータベースへの接続は下記のように記述します。

$dsn = 'mysqli://testuser:pass@localhost/testdb';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

( Written by Tatsuo Ikura )