nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

Ethna_DB_MDB2を更新

前の記事:http://d.hatena.ne.jp/nazone/20060825#p1
多分誰も使ってない気がするどころか、ライセンス的に真っ黒な気がしなくもないEthna_DB_MDB2を更新しました。(相変わらずEthna_DB_PEARからのコピペ)
http://highfreq.net/dev/Ethna_DB_MDB2.php.txt
内部的に全てプリペアドステートメントを使うようにしたので、quoteとか必要がなくなりました。一応残してあるので、今までのは動きます。
executeはarray()で引数を渡すのに、query***系は可変長引数で渡すというキチガイ仕様ですが、勘弁してください。本当は全部可変長にしたかったのですが、互換性のためにexecuteはarray()のままにしておきました。

使い方

  • インストール
    • Ethnaのclass/DBフォルダに入れるだけ(ファイル名はEthna_DB_MDB2.phpにしてね)
  • 準備
    • etc/**-ini.phpでデータソースを定義
    • app/**_Controller.php
require_once 'Ethna/class/DB/Ethna_DB_MDB2.php';

して、データソースを適当に入れて、$classの'db'の部分を'Ethna_DB_MDB2'にする。

  • とりあえず全件取得
$dbh =& $this->backend->getDB();
$data = $dbh->queryAll('SELECT * FROM table WHERE id = ?', $id);
  • 普通にprepare→execute
$dbh =& $this->backend->getDB();
$sth = $dbh->prepare('INSERT INTO table (id, name) VALUES(?, ?)');
$result = $dbh->execute($sth, array($id, $name));
$dhb->freeStatement($sth);

それぞれエラーの場合はEthna_Errorが返ってくるので、Ethna::isErrorで判断するといいかもです。(ただし、その前にMDB2のエラーで落ちることがほとんどです)
しかしEthnaの中の人はプリペアドステートメントの存在知らないのかなぁ。Ethna_AppObjectも引数をaddslashesしてるだけだし(SQLiteの場合だけ違うけど)、

PHP 利用時に Shift_JIS で addslashes() によるエスケープ処理に SQL インジェクション可能な穴
http://d.hatena.ne.jp/hoshikuzu/20060211#P20060211PHPSQLINJECTION

なんだけどなぁ。まあこの記事だとプリペアドステートメントでも完璧じゃないみたいだけど。
Ethna使ってる人でEthna_DB_PEAREthna_AppObjectを使っている人ってどのくらいいるんだろう。