我最近在我的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.
对此有任何帮助将不胜感激!
答案 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());