【问题标题】:PHP messaging system wont display the first messagePHP消息系统不会显示第一条消息
【发布时间】:2015-11-05 15:10:30
【问题描述】:

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

我已经测试过了,它似乎不是 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');

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

【问题讨论】:

  • 发送第一条消息后,您是否尝试过直接对数据库运行 SQL 语句(通过 PHPMyAdmin 或 MySQL Workbench)?它是否提供了预期的行?
  • $row = mysqli_fetch_array($result); 的预期用途是什么?尝试删除它。如果可行,我会发布一个解释原因的答案。
  • 我认为@HPierce 是在正确的轨道上。
  • @MonkeyZeus 我可以确认从数据库运行时它确实提供了正确的结果

标签: php mysql message message-queue


【解决方案1】:

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

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

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

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

【讨论】:

  • 哇,谢谢伙计,不敢相信我看过了。我确实注意到了它,但我认为它不会对它产生负面影响,因为我没有使用它。有趣的解释也是如此。谢谢你。
【解决方案2】:

听起来你有一个“竞争条件”......因为你试图在插入之前检索消息。例如,在这些行中:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2017-02-15
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多