PEAR の DB モジュールで oci8 つまり oracle8i にアクセスしていたら,
なぜか getOne()
が動かない.
同じ SQL で prepare()
→ execute()
するときちんと動く.
あるいは,バインド変数を使わないで値を埋め込むと動く.
何これ.
またもや調査.うーんうーん.どうやら,DB/oci8.php
の
freePrepared()
の中で ocifreestatement()
しているのが良くないみたい.
どうもこの時点で statement だけでなくバインド変数まで free されてしまっているように見える.
これ oci8.php
のバグじゃねーのー?
や,oci8 としては仕様なのかもしれんけど,
実際,PEAR::DB
の機能として正常に動いていないわけで.
つってもこんな明白なバグが放置されてるとは考えにくいんで,
まぁここの環境とか oracle と liboci8 のバージョンとか,色々と絡むのかもしれん.
で,まぁ例によって DB/oci8.php
をいぢってしまえば解決なわけですが,
ここはひとつ,最近話題の MDB モジュールの方を試してみましょうよ.
幸いにも pear install コマンドが使えるようになったので導入も楽々だ.
で,導入っと.使い方は基本的には PEAR::DB
とほとんど変わらない.
$mdb = MDB::connect( 'datasource name' );
$hoge = $mdb->getOne( 'select hoge from moge where fuga = ?', null, array( $fuga ) );
PEAR::DB
と違い,
getOne()
の第二引数は,リザルトの変数型の一覧を渡すようになっていて,
バインド変数の一覧は 3番目の引数で渡すようになっている.
っていうか,ほとんどのメソッドではバインド変数を渡すことができなくなっている?
んー,query()
でこれが渡せないと,
insert 文とかを作るのがめんどくせーのですが.
いちいち prepareQuery()
→ execute()
しねーとダメですかそうですか.