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@ を書き換えることで対処する。