プロジェクト

全般

プロフィール

Bug(バグ) #4131

Youichi Kimura7年以上前に更新

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

戻る