プロジェクト

全般

プロフィール

Bug(バグ) #3273

Youichi Kimura11年以上前に更新

h3. 現象

MySQL を使用している SNS で、API を使用して http://sns.example.com/api.php/activity/search.json?member_id=1 のように特定メンバーのアクティビティを取得しようとすると Internal MySQLを使用しているSNSで、http://sns.example.com/api.php/activity/search.json?member_id=1 のように特定メンバーのアクティビティを取得しようとすると、取得するメンバーが「自分」「非フレンド」「ブロックされている」のいずれかである場合にInternal Server Error が返ってしまう場合がある。 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 の問題を回避する修正を施す

戻る