Bug(バグ) #3052
Rimpei Ogawa さんが12年以上前に更新
h3. 現象 activity/community.json 呼び出し時に下記のようなエラーがhttpdのエラーログに出力されて500エラーとなる。 <pre> SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens </pre> is_active: 0 のメンバー(仮登録中のメンバー)が1人以上いる場合に発生する。 h3. 原因 マイフレンドまで公開のアクティビティを取得するための条件の中で、is_active: 0 のメンバーを対象外とするためにサブクエリ内に @member_id_to NOT IN ?@ を追加していたが、この形式の DQL を Doctrine が正しくパースできず、最終的にパラメーター数が一致しない SQL とパラメーターの組が生成されていたためにエラーとなっていた。 再現手順を含め原因は不明。修正は実際にエラーが発生する環境で行った。 inactiveIds が空の場合は opDoctrineQuery::andWhereIn() により @->andWhere('0 = 1');@ に書き換えられるため問題が発生しない。 h3. 修正内容 問題箇所のクエリでは Member モデルを必ず leftJoin しているため、opActivateListener により is_active のチェックが自動的に追加される。 このクエリにおいて is_active: 0 のメンバーを除外するには Member に対する絞り込みのみで十分であるため、マイフレンドまで公開のアクティビティを抽出する部分からは is_active: 0 を除外する条件を冗長と判断し削除した。 activity/search.json内で呼ばれるクエリ内のWHERE INを含む条件をサブクエリの外へ移動した。