Pear::MDB2を試す

LAMP環境でウェブアプリを作るときはほぼすべてでPear:DBを利用してましたが、なんか気付いたら「Pear::DBはもう古いから、Pear:MDB2を使え」という流れになってきてるようです。
すでにPear::DBは開発もストップしてバグフィックスくらいしか行われないそうで、じゃあ面倒だけどMDB2を試してみようか、ってことで双方を比較しながら使ってみました。

◆インストール

# pear install MDB2
# pear install MDB2_Driver_mysql
# pear install MDB2_Driver_sqlite

使うRDBMSに応じてドライバを入れる必要があるみたいです。
とりあえずMySQLSQLiteを入れときました。


◆DSN

DSNの記述方法はDBもMDB2も同じ。

自分はこんな感じにしてます。
define('DSN', 'mysql://root:password@localhost/dbname');


◆接続

これも双方同じ。

$db = DB::connect(DSN);

$mdb2 = MDB2::connect(DSN);

ちなみにMDB2ではconnect()以外にfactory()とsingleton()を使っても接続できるようです。
とりあえず今は接続できればそれでいいので、そのうち調べてみようと思います。


◆quote

DBはquoteSmart()、MDB2はquote()。

$db->quoteSmart($str)

$mdb2->quote($str)

MDB2のquoteは第4引数まで指定が可能です。

1:クォートされる値(必須)
2:データ型
3:値をクォートするか
4:ワイルドカードをクォートするか


dml文の実行(insert,update,delete)

MDB2ではexec()を使用。

$sql = "insert into (col1, col2) values (111, 222) ";
$res = $mdb2->exec($sql);


◆select文の実行

▽DBの場合

$sql = "select * from table ";
$rs = $db->limitQuery($sql, 0, 20);

while($row = $rs->fetchRow(DB_FETCHMODE_ASSOC)){ print_r($row); }


MDB2の場合

$mdb2->loadModule('Extended');

$sql = "select * from table ";
$rs = $mdb2->limitQuery($sql, 0, 20);

while($row = $rs->fetchRow(MDB2_FETCHMODE_ASSOC)){ print_r($row); }


ほぼ同じでいけますが、MDB2ではlimitQueryなどの関数が標準でサポートされていないので、使う場合はExtendedモジュールをロードしておく必要があります。
なおExtendedモジュールなしの場合、limitQuery()をquery()にし、

$mdb2->setLimit(20,0);

としてlimitを指定する必要があります。
limitQuery()は第2引数がスタート地点、第3引数が表示件数なのに対し、setLimit()は順番が逆になっているので注意が必要です。


▽get***() → query***

DBのget***()はすべてMDB2のquery***に移行されています。

getAll → queryAll
getOne → queryOne
getRow → queryRow
getCol → queryCol


トランザクション

DBのautoCommit()の代わりにbeginTransaction()を使います。

$res = $mdb2->beginTransaction();//トランザクション開始
$res = $mdb2->rollback();//ロールバック
$res = $mdb2->commit();//コミット



ひとまず以上です。
まだ表面的な部分しか見てないですが、DBもMDB2もほとんど同じだと思います。
関数名がちょっと違いますが、代替の関数が用意されてるし、そんなに困らないはず。
いい機会なので、今後作るアプリはMDB2を使っていこうと思ってます。