プロジェクト

全般

プロフィール

Bug(バグ) #4131

Youichi Kimura さんがほぼ8年前に更新

h3. Overview (現象) 

 <pre><code class="php"> 
 $query = Doctrine_Core::getTable('AdminUser')->createQuery() 
   ->select('*') 
   ->andWhere('id IN ?'); 

 // (1) 生成されるクエリ: SELECT ... FROM admin_user a WHERE (a.id IN (?)) 
 $query->execute(array(array(1))); 

 // (2) 生成されるクエリ: SELECT ... FROM admin_user a WHERE (a.id IN (?, ?)) 
 $query->execute(array(array(1, 2))); 
 </code></pre> 

 上記のコードを実行すると、(1) の状態で生成されたクエリキャッシュが (2) でも使用され、パラメーターの数が一致せず下記のエラーが発生する。 

 <pre> 
 SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 
 </pre> 

 このような、@Doctrine_Query::execute()@ が呼び出されるまでプリペアドステートメントの形式が不定となる状況に @Doctrine_Query_Abstract::calculateQueryCacheHash()@ および @opDoctrineQuery::calculateQueryCacheHash()@ のいずれも対応できていない。 

 h3. Way to fix (修正内容) 

 @calculateQueryCacheHash()@ メソッド内では @execute()@ メソッドに渡されたパラメータの値を参照する手段が存在しない。 
 そのため opDoctrineQuery クラスで @Doctrine_Query::execute()@ をオーバーライドし、渡されたパラメータに応じて一時的に @$this->whereInCount@ を書き換えることで対処する。 

戻る