Мои данные из моего цикла не совпадают, не знаю почему - PullRequest
1 голос
/ 21 июня 2019

У меня есть код, который должен отображать сообщения между пользователями.По какой-то причине данные не совпадают, и я не уверен, где в моем коде у меня ошибка.Я пытался изменить свои операторы if на $x < $sender, но это не сработало.

1

, но отображаемые данные не совпадают с данными базы данных.

2

Сообщение «Тест 2» было отправлено с woof3, поэтому оно должно быть зеленым, а не синим при входе в систему как woof.И "тест снова" был отправлен из woof, поэтому он должен быть синим при входе в систему как woof

Редактировать рабочий код ниже, без pdo, потому что я не закончил с этим проектом, и я сохраняю их для концасделать тестирование проще.

<?php

include "../Site/db.php";

$url = $_SERVER['REQUEST_URI'];
$urlArray = explode('=', $url);
$Username = $urlArray[sizeof($urlArray) - 1];

$Myself = $_SESSION['username'];

$sql = "SELECT * FROM messages ORDER BY `Id` ASC";
$result = $conn->query($sql);

// Header of message box
echo '<div id="messages" class="messagePersonBox shadow">
        <span class="usersname" name="receiver"><a href="Account?='.$Username.'">'.$Username.'</a></span>
<hr style="margin-top:24px">
<div id="allMessages"class="allMessages">
';

// $sql2 = "SELECT * FROM messages WHERE Sender = '$Myself' ORDER BY `Id` ASC";
// $result2 = $conn->query($sql2);

$sql3 = "SELECT *  FROM messages 
        WHERE (Sender = '$Myself' AND Receiver = '$Username')
           OR (Receiver = '$Myself' AND Sender = '$Username') ORDER BY `MessageTime` ASC";


$result3 = $conn->query($sql3);
print_r($result3);
$x = 0;

$sql4 = "SELECT * FROM messages WHERE Sender = '$Myself'";
$result4 = $conn->query($sql4);

$sql5 = "SELECT * FROM messages WHERE Receiver = '$Myself'";
$result5 = $conn->query($sql5);

$totalSender = mysqli_num_rows($result4);
$totalReceiver = mysqli_num_rows($result5);

// might have to add both totals for while loop
// to get total messages
$totalmessages = mysqli_num_rows($result);

// For receiving
while ($x < $totalmessages) {

    // output data of each row

     if ($result3->num_rows > 0) {
         if ($row = $result3->fetch_assoc()) {
             $Sender = $row['Sender'];
             $Message = $row['Message'];
             $Receiver = $row['Receiver'];
             $TimeSent = $row['MessageTime'];
         }
     }
       $class = $Sender == $Myself ? 'messageDisplay' : 'messageDisplay2';


     // sending a message

         echo '<div id="messages2" class="'.$class.'">'.$Message.'<span style="float: right;margin-top:2px"><font size=1>'.time_elapsed_string($TimeSent).'</span></font></div>';



$x++;
}

// Typing part of message
echo '</div>
      <input type="text" id="messagetosend" name="message" class="messagetype" placeholder="Type a message..."><span id="send" class="messageSend">↩</span>

</div>';
?>

Я могу добавить больше информации, если это необходимо.

1 Ответ

0 голосов
/ 21 июня 2019

Я предлагаю вам сделать шаг назад и немного реструктурировать этот подход.

Например, вам не нужно conversationID (по крайней мере, не в его текущем формате), так как вы можете вычесть его из Sender и Receiver, что более точно. Вам также не нужно MessageDate, поскольку MessageTime - это значение даты и времени, которое содержит дату и время. Таким образом, conversationID и MessageDate могут быть удалены.

Затем мы можем очистить количество запросов. Вы хотите получить все сообщения, если вы являетесь отправителем, а другой пользователь - получателем, или , где вы являетесь получателем, а другой пользователь - отправителем этого сообщения. Затем мы сортируем по дате (не по идентификатору!) И проверяем, должно ли сообщение быть зеленым или синим на основе значения Sender этой строки - устанавливаем переменную $class с одним значением для синего, если отправитель является текущим пользователь, зеленый в противном случае.

Как примечание, при выводе блоков HTML вы можете выйти из PHP, что облегчает чтение (и работу с кавычками). У вас также были элементы HTML с тем же идентификатором, что недопустимо.

Вы также должны использовать подготовленные операторы при работе с переменными в запросе.

<?php

include "../Site/db.php";

$url = $_SERVER['REQUEST_URI'];
$urlArray = explode('=', $url);
$Username = $urlArray[sizeof($urlArray) - 1];

$Myself = $_SESSION['username'];

$sql = "SELECT Message, MessageTime, Sender, Receiver
        FROM messages 
        WHERE (Sender = ? AND Receiver = ?)
           OR (Receiver = ? AND Sender = ?)
        ORDER BY `MessageTime` ASC");
if (!$stmt = $conn->prepare($sql)) {
    error_log($conn->error);
    die("An error occurred fetching messages");
}
$stmt->bind_param("ssss", $Myself, $Username, $Myself, $Username);
$stmt->bind_result($message, $timeSent, $sender, $received);
if (!$stmt->execute()) {
    error_log($stmt->error);
    die("An error occurred fetching messages");
}
?>
<!-- Header of message box -->
<div id="messages" class="messagePersonBox shadow">
    <span class="usersname" name="receiver"><a href="Account?=<?php echo $Username; ?>"><?php echo $Username; ?></a></span>
    <hr style="margin-top:24px">
    <div id="allMessages" class="allMessages">
        <?php 
        while ($stmt->fetch()) {
            $class = $sender == $Myself ? 'messageDisplay' : 'messageDisplay1'; // Check which class should be used; if I'm the sender, show messageDisplay, if not show MessageDisplay1 
            ?>
            <div class="<?php echo $class; ?>
                <?php echo $message; ?>
                <span style="float: right; margin-top: 2px">
                    <?php echo time_elapsed_string($timeSent); ?>
                </span>
            </div>
            <?php 
        }
        ?>
    <!-- Typing part of message -->
    </div>
    <input type="text" id="messagetosend" name="message" class="messagetype" placeholder="Type a message..."><span id="send" class="messageSend">↩</span>
</div>
<?php 
$stmt->close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...