Zend Server CE 5.0 for IBM iのdb2_bind_paramで
Zend Server CE 5.0 for IBM i(PHP 5.3 Ver)で、最初からインスコされているIBM_DB2のPECLはバージョン”1.8.4”です。このバージョン”1.8.4”のPECLは、既知のバグがあり、関数、クラス内で「db2_prepare → db2_bind_param → db2_execute」をすると、db2_bind_param関数で割り当てる、変数のスコープがどうもおかしいようで、以下のようなエラーになります。
Warning: db2_execute() [function.db2-execute]: Value Not Bound in hoge.php on line XX Warning: db2_execute() [function.db2-execute]: Binding Error 3 in
PECLのサポートサイトより
- http://pecl.php.net/bugs/bug.php?id=17004 「 #17004 design problem with function db2_bind_param」
- http://pecl.php.net/bugs/bug.php?id=6528 「 #6528 scoping problem in db2_bind_param」
最新のPECLでは、この既知の問題は解決しているようなので、IBM iのZend Server CEに、2011.09.28現在最新の”1.9.2”を導入しました。
いったんは、IBM i上でビルドを試みましたが、「ibm_db2.so」は出来上がるものの、ファイルのバイト数が明らかに小さく、起動時にエクステンションエラーになってしまいました。結果的にはAIX上でビルドしたエクステンションは、正常通り動作しました。「db2_prepare → db2_bind_param → db2_execute」も問題なく使えます。
もし、バイナリが欲しい方がいたら、このブログにコメント下さい。1.9.2の”ibm_db2.so”を提供します。但し、使用は自己責任で。
ビルドの際に、宣言エラーが抜けている様なので、以下の箇所を追加しました。
-- エラー1 ../ibm_db2-1.9.2/ibm_db2.c: In function '_php_db2_connect_helper': ../ibm_db2.c:2109: error: 'conn_handle' has no member named 'c_i5_allow_commit' -- 対応:「ibm_db2.c」に宣言を追加 114 long c_i5_allow_commit; -- エラー2 ../ibm_db2-1.9.2/ibm_db2.c: In function '_ibm_db_chaining_flag': ../ibm_db2-1.9.2/ibm_db2.c:6761: error: 'SQL_ATTR_CHAINING_BEGIN' undeclared (first use in this function) -- 対応:「php_ibm_db2.h」に定数を追加 302 #ifdef PASE /* i5/OS ease of use turn off/on */ 303 #ifndef SQL_ATTR_CHAINING_BEGIN- 304 #define SQL_ATTR_CHAINING_BEGIN 2464 305 #define SQL_ATTR_CHAINING_END 2465 306 #define SQL_IS_POINTER -4 307 #endif- 308 #endif /* PASE */
PECL 1.9.2の確認
とりあえず、この情報が役立つか判らないけど、PECLのサポートに上げておいた。
http://pecl.php.net/bugs/bug.php?id=24382