0

私が抱えている問題を説明するために最善を尽くします:)

私のフォーラムの各スレッド/トピックは、1 つのディスクを表します。フォーラムの登録メンバーは、一連のチェックボックス (各ディスクの横に表示されるチェックボックス) を使用して、コレクションにある各ディスクにチェックを入れます。フォームが $_POST されると、次のように情報がテーブルに保存されます。

| | ユーザー ID - ディスク ID |
+--------------------+
| 2 - 571 |
| | 2 - 603 |
| | 2 - 4532 |

ユーザーが次にフォーラムを表示すると、ユーザーが所有するディスクのチェックボックスがチェックされ、無効になります。これは以下を使用して行われます。

$sql = 'SELECT id, poster, subject, posted, last_post, last_post_id,
last_poster, num_views, num_replies, closed, sticky, moved_to, topicimage,
c.user_id, c.disc_id FROM topics LEFT JOIN collections AS c ON c.disc_id=id
WHERE forum_id='.$id.' ORDER BY sticky DESC;

上記はすべてのディスクを取得し、次の (簡略化された) コードを使用して表示します。

$result = $db->query($sql) or error('Unable to fetch topic list '.$sql.'', __FILE__, __LINE__, $db->error());

// If there are topics in this forum
if ($db->num_rows($result))
{

while ($cur_topic = $db->fetch_assoc($result)) { // ログインしているユーザー ID が現在のディスクの user_id と一致する場合 (つまり、このユーザーがこのディスクを所有している場合) if ($cur_topic['user_id']==$pun_user ['id']) { $read = '
私はこれを所有しています!'; } else { $read = '
私はこれを所有しています!'; } } }

2 番目のユーザーが同じディスク ID を自分のコレクションに追加するまで、これはうまく機能します。

| | ユーザー ID - ディスク ID |
+--------------------+
| 2 - 571 |
| | 2 - 603 |
| | 6 - 571 |

これにより、重複したスレッドがフォーラムに表示されます。1 つは正しくチェックされており (私が所有しているため)、もう 1 つはチェックされていませんが、トピック ID や画像などの同じ情報をすべて共有しています。

私の最初の考えは、GROUP BY c.disc_id を SQL に追加しようとすることでした。これにより、重複するトピックが正常に削除されますが、間違ったトピックが削除されます。チェックを入れたディスクは表示されなくなり、チェックを外したバージョンだけが残ります。

それが理にかなっていることを願っています。誰でも洞察やアイデアを提供できますか? どうもありがとう。

4

2 に答える 2

0

私はあなたのスキーマを知らないので、これは推測ですが、WHERE 句でユーザーの ID を指定しているようには見えません。

以下のようなものはどうでしょうか。

  SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_post_id,
         t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky,
         t.moved_to, t.topicimage, c.user_id, c.disc_id
    FROM topics AS t LEFT JOIN collections AS c ON c.disc_id = t.id
   WHERE forum_id = '.$id.'
     AND c.user_id = '.$user_id.'
ORDER BY t.sticky DESC;

また、トピック ID = ディスク ID で参加しています。それは意図的なものですか?

于 2010-03-01T01:25:48.423 に答える
0

これを解決する簡単な方法が2 つあります。

最初:

2 つのクエリを使用して、クエリと 2 つ目のクエリをグループ化し、ユーザーが所有するすべての disc_id を取得します

2番目:

あなたの最初のクエリで:

if ($db->num_rows($result)) {
  $array = Array();
  while ($cur_topic = $db->fetch_assoc($result)) {
    $id = $cur_topic['disc_id'];
    if (!array_key_exists ($id, $array)) { // allow only result per disc_id
      $array[$id] = $cur_topic;
      $array[$id]['owned'] = false;
    }
    // If logged in users ID matches the current discs user_id (i.e if this user owns this disc)
    if ($cur_topic['user_id']==$pun_user['id']) // check if one is owned by the user
      $array['owned'] = true;
  }
  foreach ($array as $cur_topic) {
    if ($cur_topic['owned']) { 
      $read = '<br /><input type="checkbox" disabled="disabled" checked="checked" /> <span style="color:#999">I own this!</span>';
    } else {
      $read = '<br /><input type="checkbox" name="discs[]" value="'.$cur_topic['id'].'" /> I own this!';
    }
  }
}
于 2010-03-01T01:42:07.007 に答える