2008-05-11

PEAR::MDB2を使ってPHPで少しまともなDBアクセスをする

PHPでMySQLを使う方法として最もプリミティブなのは mysql_* 関数を使うというものだ。
これは Cの MySQL APIを PHPにほぼそのままバインドしたローレベルAPIで、使いやすくないし使い方を誤ると危険だし他のDBとの互換性もない。

というわけで JavaでいうJDBCのようなレイヤを提供する、PEARの MDB2を使ってみることにした。

MySQLの場合、
CentOSなら
yum install php-pear-MDB2-Driver-mysql
/etc/php.ini を編集し safe_modeをオフ、include_pathに /usr/share/pearを追加

Gentooなら
emerge PEAR-MDB2_Driver_mysql
のようにしてMDB2をインストールする。使い方は下記のようになる。
(シングルクエリのオペレーションにわざわざトランザクション制御を含めているのは単に用例を示すため)

// MDB2をロードする
require_once('MDB2.php');

// データベースへ接続する
$db =& MDB2::connect("mysql://ユーザー名:パスワード@ホスト名/データベース名");

// 接続エラーのチェック
if (MDB2::isError($db) {
throw new exception("データベース接続エラー");
}
// トランザクションを開始する
$db->beginTransaction();

// PreparedStatementの作成
$sql = "select id,name from emp where dept_id=?";
$types = array('integer'); // プレースホルダの位置にセットされる値の型名リスト('integer', 'text'等)
$sth = $db->prepare($sql, $types);

// クエリの実行
$values = array(1); // プレースホルダの位置にセットされる値のリスト
$res = $sth->execute($values);
$sth->free(); // ここで解放して良いのか?

// 実行エラーのチェックを必ず行う
if (PEAR::isError($res)) {
$msg = $res->getMessage();
$db->rollback();// トランザクションをロールバックする
$db->disconnect(); // データベース接続を解放
throw new exception($msg);
}
// 結果を1行ずつassoclistにフェッチ

while ($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)) {
$id = $row['id'];
$name = $row['name'];
// ...
}
$db->commit(); // トランザクションをコミットする
$db->disconnect(); // データベース接続を解放

0 件のコメント:

コメントを投稿

<< ホーム