0

私は自分のサイトの 1 つのメッセージング システムに取り組んでおり、メッセージを表示する際に多くの問題を抱えています。何らかの理由で、構文を正しく取得できないため、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."; 
}

私は何を間違っていますか?直ったと思ったのですが、同じ記録を5回吐き出しました。グループ化を試みましたが、レコードは 1 つしかありませんでした。$s 呼び出しを while ループの外に移動しようとしましたが、送信者の user_id をそのように描画することはできません。どうすればいいのかわからず、過去数時間にわたってあちこち検索しましたが、探しているものが正確に見つからないか、質問を正しく入力していません。

前もって感謝します。

4

2 に答える 2

1

JOIN を使用して、1 つのクエリですべてを取得します。

$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 に答える