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

PHP

この記事は 2013年4月に STBBS.NET Blogから移動されたものです

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(); // データベース接続を解放

同じカテゴリの記事

Pythonで Scalaの findのように条件にマッチする最初の要素をリストから取得する 2014年1月18日
PHP 5.2を今の環境でビルドする 2013年3月27日
phpMyAdmin 3.2.2.1でデータベース一覧が表示できない時 2009年11月19日
Reverse Proxyの裏にいるホストでphpMyAdminを使う場合 2009年5月28日
PHPでMDB2を使ったデータベース操作のユニットテストをする 2008年10月17日

お勧めカテゴリ

英語でアニメ観ようず
なじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。
ScalaのようでJavaだけど少しScalaなJSON API
Scalaと Spring Frameworkを使って REST的なJSON APIを実装してみましょう。
ドクジリアン柔術少女 すから☆ぱいそん
代表 嶋田大貴のブログです。写真は神仏に見せ金をはたらく罰当たりの図