Я использую PHP и создал довольно сложную систему обмена сообщениями. Но моя проблема в том, что оно не покажет первое сообщение, пока оно не будет «подтолкнуто» вверх. Если я захожу в чей-то профиль и отправляю им сообщение, первое сообщение не будет отображаться, но если я отправлю другое, первое покажет, а второе — нет … пока я не отправлю третье сообщение, то отобразятся первое и второе. и так далее и тому подобное.
Я проверил это, и это, кажется, не CSS или MySQL. Текст на самом деле отображается, и база данных хранит каждое сообщение в секунду, когда оно отправлено. Я даже отправляю 1 сообщение, иду домой, а затем проверяю, было ли оно отправлено, и оно было, но оно не будет отображаться, пока не будет отправлено 2-е. База данных также показывает данные сообщения, которые хранятся, и это там и все.
Есть ли способ нажать строку в моем выводе php вперед на один? Так что это на ходу?
Этот код ниже проверяет наличие любых сообщений между двумя пользователями из базы данных и сохраняет их в массиве, если они существуют.
$query = "select * from messages INNER JOIN users u on u.userid = messages.createduserid
where (createduserid='$user' && recuserid='$recuser') OR (createduserid='$recuser' && recuserid='$user')
ORDER BY createddate DESC limit 6 " or die("Error in the consult.." . mysqli_error($connection));
$result = $connection->query($query);
$row = mysqli_fetch_array($result);
Это берет массив, созданный выше, и помещает это для пользователей, чтобы видеть
while ($profilepreviewlist = $result->fetch_assoc()) {
echo '<div class="previewlistitem">';
echo'<p class="messagetext">';
echo $profilepreviewlist['username'],': ';
echo $profilepreviewlist['body'];
echo'<div class="messagedate">';
echo ($profilepreviewlist["createddate"]);
echo'</div>';
echo'</p>';
echo '</div>';
}
?>
Когда эта кнопка нажата, сообщение отправляется и запускает код под ним
<input class="input" name="messageplace" placeholder="Type a message here" id="messageplace">
Этот код хранит данные из их сообщения, отправляя их в базу данных, затем обновляет страницу сообщения
$userid = $_SESSION['userid'];
$recuserid = $_SESSION['tempuserid'];
$body=$_POST['messageplace'];
$datee = new DateTime("NOW");
$createddate = $datee->format('Y-m-d H:i:s');
send_message($userid,$recuserid,$body,$createddate);
include('message.php');
Если вы заинтересованы в тестировании этой функции, дайте мне знать
Когда вы звоните $row = mysqli_fetch_array($result)
вы обращаетесь к первой записи, которую возвратил ваш SQL-запрос и продвигая курсор $result
к следующей записи. Поэтому, когда вы звоните:
while ($profilepreviewlist = $result->fetch_assoc()) {
//do whatever...
}
У вас не будет доступа к первой записи в наборе, потому что вы уже обработали ее — она хранится в $row
,
Чтобы устранить проблему, удалите $row = mysqli_fetch_array($result)
, Удалив его, вы больше не обрабатываете запись и получите доступ к ней в цикле while.
Похоже, у вас есть «состояние гонки» … в котором вы пытаетесь получить сообщение до того, как оно будет вставлено. Например, в этих строках:
send_message($userid,$recuserid,$body,$createddate);
include('message.php');
Это, или вы отображаете кэшированные данные, которые были получены до вставки.
Вы не хотите увеличивать возвращаемые строки на 1; это не решит проблему.