[s2container-php5:107] IN 句に配列を利用してセットした時、「ORA-01008: バインドされていない変数があります。」
Noriyuki ITAGAKI
[E-MAIL ADDRESS DELETED]
2007年 9月 21日 (金) 11:34:05 JST
はじめまして、板垣と申します。
以下の環境で利用させていただいております。
・s2dao.php5-1.1.2.tar.gz
・s2container.php5-1.1.3.zip
・Oracle10g
・Apache/2.0.59 (Win32) PHP/5.2.3
・WindowsXP Pro
表題の件ですが、IN句の値に配列で設定したいのですが、以下のようにして、呼
び出したときエラーが発生しました。設定の方法は正しいでしょうか。
○PHPコード
$hogeIds= array(1,2,3);
$dao->getHogeList($hogeIds);
○*****_getHogeList.sql
select * form hoge_table where hoge_id in /*hogeIds*/(1)
○エラー
OCIStmtExecute: ORA-01008: バインドされていない変数があります。
(ext\pdo_oci\oci_statement.c:142)
in S2Dao\s2dao.core.classes.php on line 538
--
ソースコードを読んだところ、
S2Dao_ParenBindVariableNode.class.php:69 行目
で、引数のタイプを判定していますが、get_classは、Object以外に対して
行うと、 [false] が返却されるようです。
※ $hogeIds の要素は、primitive型。
68: if($o !== null){
69: $clazz = get_class($o);
70: }
71: }
72: $ctx->addSql('(');
73: $ctx->addSql('?', $array[0], $clazz);
そのため、属性(クラス)が false であるのに対して、
s2dao.core.classes.phpの368行目
で以下のようにして判定しているため、最終的に372 行目が実行され、
$this->getBindParamTypes($argType)
がUnknownタイプのため、「ORA-01008」エラーになるようです。
368: if($argType !== null){
369: if($this->isNullType($arg, $argType)){
370: $ps->bindValue($i + 1, $arg, S2Dao_PDOType::Null);
371: } else {
372: $ps->bindValue($i + 1, $arg,
$this->getBindParamTypes($argType));
373: }
374: } else {
375: $ps->bindValue($i + 1, $arg,
$this->getBindParamTypes($phpType));
376: }
以下のような修正方法があると思いますが、どのような対応が適切でしょうか?
または、そもそも、設定の方法が間違っていますでしょうか。
※ 現在は、「その2」の対応でテストを行っております。
その1:
S2Dao_ParenBindVariableNode.class.php
69: $clazz = get_class($o);
↓
69: if(($clazz = get_class($o)) === false){
++: $clazz = gettype($o);
++: }
その2:
s2dao.core.classes.php(368)
368: if($argType !== null){
↓
368: if($argType !== null && $argType !== false){
または、IN句に設定する配列を作成するときに、'String'、'Integer'
という名前のクラスを作成し、
$hogeIds= array(new Integer(1), new Integer(2), new Integer(3));
として、get_class の戻り値が返却されるように設定するのでしょうか。
同じような経験のある方がいらっしゃいましたら、ご教示ください。
以上、よろしくお願いいたします。
S2Container-PHP5 メーリングリストの案内