Bug(バグ) #3273
Updated by Youichi Kimura about 12 years ago
h3. 現象 MySQLを使用しているSNSで、http://sns.example.com/api.php/activity/search.json?member_id=1 のように特定メンバーのアクティビティを取得しようとすると、取得するメンバーが「自分」「非フレンド」「ブロックされている」のいずれかである場合にInternal Server Errorが返ってしまう。(フレンドの場合はエラーは起きずに正常な値が返る) h3. 原因 opActivityQueryBuilder::buildMemberQuery() 内で andWhereIn メソッドを使用している。ここで生成されるクエリはサブクエリとして使用されるため #3135 で報告されているように不正なクエリが生成されてしまう。 <pre><code class="php"> protected function buildMemberQuery($query, $memberId = null, $publicFlag = ActivityDataTable::PUBLIC_FLAG_SNS) { if (is_array($memberId)) { $query->andWhereIn('a.member_id', $memberId); } elseif ($memberId instanceof Doctrine_Query) { $query->andWhere('a.member_id IN ('.$memberId->getDql().')'); } elseif (is_scalar($memberId)) { $query->andWhere('a.member_id = ?', $memberId); } $query->andWhereIn('a.public_flag', $this->table->getViewablePublicFlags($publicFlag)); return $query; } </code></pre> h3. 修正内容 opActivityQueryBuilder::buildMemberQuery() メソッドに #3135 #3155 の問題を回避する修正を施す