PHP / MySQL SELECT语句 - 轻微问题

时间:2009-07-27 00:04:21

标签: php mysql select

我最近在我的SELECT语句中发现了一个漏洞,用于我正在开发的私人消息系统。

这是我桌子的基本结构:

tblpm:
unique_id    thread_id    subject    content    receiver_id    sender_id    date_sent

我正在开发的页面是收件箱,其中显示了用户的所有最新消息。

我使用的SELECT语句是:

$data = mysql_query("
SELECT tblpm.* FROM tblpm 
WHERE date_sent 
IN(
   SELECT MAX(date_sent)
   FROM tblpm 
   GROUP BY message_id
  )
AND receiver_id ='$usrID' 
ORDER BY id DESC") or die(mysql_error());

现在,我注意到了这一点:当我第一次向用户发送消息时,它发送正常,并且不会显示在收件箱中。 (因为它不应该,它应该出现在“已发送的项目”中)。然后,如果用户要“回复”该消息(因此,相同的线程),它也会在收件箱中显示正常。

但是,如果我回复“回复”(换言之,线程中的第三条消息),它不会再出现在收件箱中,因为SELECT语句被指示选择MAX(date_sent)一个线程WHERE的receiver_ID = $ usrID。好吧,问题是某个线程项的最新(date_sent)被其他人“接收”,因此,SELECT语句不会显示“任何”线程项。

希望这是有道理的。

以下是对正在发生的事情的直观表示:

unique_id    thread_id    subject   receiver_id    sender_id     date_sent
   1            144         Msg         22            33         2009-07-22 //Will display fine in sent items.
   2            144         re: Msg     33            22         2009-07-23 //Will display fine in inbox of user (usrID 33).
   3            144         RE: re:Msg  22            33         2009-07-24 //Once this message is sent, the entire thread (thread_id 144) no longer displays in the inbox.

对此有任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

似乎这应该做你想做的事:

$data = mysql_query("
SELECT tblpm.* FROM tblpm 
WHERE date_sent 
IN(
   SELECT MAX(date_sent)
   FROM tblpm 
   WHERE receiver_id ='$usrID' 
   GROUP BY message_id
  )
AND receiver_id ='$usrID' 
ORDER BY id DESC") or die(mysql_error());