PHP 消息系统不会显示第一条消息

PHP messaging system wont display the first message

我正在使用 PHP 并创建了一个非常复杂的消息传递系统。但我的问题是它不会显示第一条消息,直到它 "pushed" 起来。如果我转到某人的个人资料并向他们发送消息,第一条消息将不会显示,但如果我发送另一条消息,第一条显示但第二条不显示......直到我发送第三条消息,然后显示第一条和第二条等等等等。

我已经测试过了,它似乎不是 css 或 MySQL。文本实际上正在显示,并且数据库在发送的第二秒存储每条消息。我什至发送了 1 条消息,回到家,然后检查它是否已发送,但在发送第二条消息之前不会显示。数据库还显示正在存储的消息数据,它就在那里和一切。

有没有办法将我的 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');

如果您有兴趣测试该功能,请告诉我

听起来你有一个 "race-condition" ... 因为你试图在插入之前检索消息。例如,在这些行中:

send_message($userid,$recuserid,$body,$createddate);
include('message.php');

那,或者您显示的是在插入之前检索到的缓存数据。

您不想将返回的行数增加 1;这不会解决问题。

当您调用 $row = mysqli_fetch_array($result) 时,您正在访问 SQL 查询返回的第一条记录 并将 $result 的光标前进到下一条记录.因此,当您调用:

while ($profilepreviewlist = $result->fetch_assoc()) {
 //do whatever...
}

您将无法访问集合中的第一条记录,因为您已经对其进行了处理 - 它存储在 $row

要解决此问题,请删除 $row = mysqli_fetch_array($result)。通过删除它,您将不再处理该记录,并且可以在 while 循环中访问它。