0

我正在为我的一个站点开发一个消息传递系统,并且在显示消息时遇到了很多问题。由于某种原因,我无法获得正确的语法,因此如果 user_id 与receiver_id 匹配,它将显示与receiver_id 匹配的每个值。我让它在我的 Windows 测试机器上运行良好,但是当我将它上传到我的 ubuntu 服务器时它坏了。所以现在我正在尝试修复代码。我所拥有的是:

$m = "SELECT m.message_id, m.receiver_id, m.sender_id, m.subject, m.body, m.posted, u.id, u.username FROM messages m, users u WHERE u.id = {$_SESSION['id']}";

$b = mysqli_query($dbc, $m);


?>
<div class="mailbox">
<a href="inbox.php?id=<?php echo $_GET['id']; ?>">Inbox</a><br />
<a href="sent.php?id=<?php echo $_GET['id']; ?>">Sent</a><br />
</div>
<div class="mailbox">    
<h2>Messages for <?php echo $_SESSION['username']; ?></h2>

<?php echo output_message($message); ?>

<div id="messages">
<?php
if (mysqli_num_rows($b) > 0) {
while ($mess_row = mysqli_fetch_array($b, MYSQLI_NUM)) {
    $u = "SELECT * FROM users WHERE id={$mess_row[1]}";
    $rec = mysqli_query($dbc, $u);

    $rec_row = mysqli_fetch_array($rec, MYSQLI_NUM);

    $s = "SELECT * FROM users WHERE id={$mess_row[2]}";
    $send = mysqli_query($dbc, $r);

    $send_row = mysqli_fetch_array($send, MYSQLI_NUM);
    echo "<a href=\"received.php?id=$mess_row[0]&sender=$send_row[1]\">$mess_row[3]</a> Posted by: <b><a href=\"profile.php?id=$mess_row[2]\">$send_row[1]</a></b> on: $mess_row[5]<br /><hr />";
}
} else {
echo "No messages."; 
}

我究竟做错了什么?我以为我已经修复了它,但它只是吐出五次相同的记录。我尝试分组,它只给了我 1 条记录。我尝试将 $s 调用移到 while 循环之外,但我无法以这种方式利用发件人的 user_id。我只是不知道该怎么做,过去几个小时我一直在搜索,但我找不到我要找的确切内容,或者我没有正确输入问题。

提前致谢。

4

2 回答 2

1

使用 JOIN 在一个查询中获取所有内容:

$m = "SELECT m.message_id, m.receiver_id, m.sender_id, m.subject, m.body, m.posted, s.username sender_name, r.username receiver_name
      FROM messages m
      JOIN users r ON r.id = m.receiver_id
      JOIN users s ON s.id = m.sender_id
      WHERE u.id = {$_SESSION['id']}";
于 2013-05-30T01:36:39.587 回答
0

我很抱歉匆忙把这个放在一起。希望能帮助到你。

使用它作为您的查询,那么您将不必经历并执行那些可怕的额外查询来获取用户信息。

$id = $dbc->real_escape_string($_SESSION['id']);

$m = "SELECT m.message_id, m.receiver_id, m.sender_id, m.subject, m.body, m.posted, u.id, u.username 
FROM messages m
INNER JOIN users u ON m.receiver_id=u.id
WHERE u.id = '$id';";

额外说明:您需要转义会话 ID 字符串。我可能还会使用正则表达式验证它只是数字。

编辑:使用@Barmar 回答查询代替我的。我仍然会添加转义/正则表达式。

于 2013-05-30T01:33:22.313 回答