前の記事: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()のままにしておきました。
使い方
- インストール
- 準備
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_PEARやEthna_AppObjectを使っている人ってどのくらいいるんだろう。