1

我已经在我正在从事的一个项目的道路上走了很长一段路。但是我似乎无法让它工作。

该脚本相当“简单”,但我无法以我想要的方式获得它。我列出了一个收件箱,我可以在其中看到我发送的消息和收到的消息,但是这些是 ID 而不是用户名,我想将 ID 链接到另一个表中的用户名。

所以假设我是 ID 42 用户名 = Moominen
,接收者是 ID 50 用户名 = turtle

表消息

sent_to|sent_by|message|sent_time
  42   |  50   | ....  | .....
  50   |  42   | ....  | .....

表成员

Memberid|Username|profilepic|
  42    |moominen|img.png   |
  50    |turtle  |turtle.png|

因此,除了更改 SQL 查询的 IF 语句外,我几乎已经完成了所有工作。

$querysent = "SELECT * FROM messages WHERE (sent_by=".$logged." or sent_to=".$logged.")                   ORDER BY sent_time desc";
$sqlsent = mysqli_query($dbc,$querysent) or die(mysqli_error($dbc));
echo '<h3>Messages</h3>';
while($fetchsent = mysqli_fetch_array($sqlsent)) {
if ($fetchsent["sent_by"] == $logged) {
    $query = "SELECT Memberid, Username, profilepic FROM members WHERE Memberid=$logged LIMIT 1";
} else {
    $query = "SELECT Memberid, Username, profilepic FROM members WHERE Memberid=".$fetchsent["sent_by"]." LIMIT 1";
}

$sql = mysqli_query($dbc,$query) or die(mysqli_error($dbc));
$fetch = mysqli_fetch_assoc($sql) or die(mysqli_error($dbc));

echo '<table class="table-condensed">
    <th>Sent by</th><th>Sent To</th><th>Message</th><th>Time</th>';
echo ('<tr><td><a href="index.php?page=profile&id='.$fetchsent["sent_by"].'">'.$fetch["Username"].'</a></td>
    <td><a href="index.php?page=profile&id='.$fetchsent["sent_to"].'">'.$fetch["Username"].'</td>
    <td>'.$fetchsent["message"].'</td>
    <td><abbr class="postdate" title="'.$fetchsent["sent_time"].'"></a></td>

    ');
echo ('</tr>');
echo '</table>';
}

问题是我无法将用户名链接到表中的相应 ID。

4

1 回答 1

0

您最好使用 an INNER JOIN- 这将返回两组表中匹配的所有字段。如果您想messages在表中没有匹配结果的情况下获取所有结果members,您可以使用LEFT JOIN.

以下是更改查询的方法:

$querysent = "SELECT * FROM messages WHERE (sent_by=".$logged." or sent_to=".$logged.") ORDER BY sent_time desc";

将更改为:

$querysent = 
"SELECT m.*, mm.Memberid as Memberid_from, mm.Username as Username_from, mm.profilepic as profilepic_from, mmm.Memberid as Memberid_to, mmm.Username as Username_to, mmm.profilepic as profilepic_to 
FROM messages m 
INNER JOIN members mm ON mm.Memberid=m.sent_by 
INNER JOIN members mmm ON mmm.Memberid=m.sent_to 
WHERE (m.sent_by=".$logged." or m.sent_to=".$logged.") ORDER BY m.sent_time desc";

您现在应该使用$fetchsent["Username_from"]来获取 sent_by 并$fetchsent["Username_to"]获取 sent_to

如果您想了解更多关于 JOINS 的信息,请查看相关文档: http ://dev.mysql.com/doc/refman/5.0/en/join.html

旁注 我强烈建议切换到 PDO - 准备好的语句将负责保护您免受 SQL 注入等影响。

于 2013-09-05T16:20:40.493 回答