代码之家  ›  专栏  ›  技术社区  ›  triswill227

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

  •  2
  • triswill227  · 技术社区  · 9 年前

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

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

    有没有方法将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');
    

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

    2 回复  |  直到 9 年前
        1
  •  4
  •   HPierce    9 年前

    当你打电话时 $row = mysqli_fetch_array($result) 您正在访问SQL查询返回的第一条记录 并将光标前移 $result 到下一个记录 。因此,当您拨打电话时:

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

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

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

        2
  •  3
  •   Kevin Seifert    9 年前

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

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

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

    您不希望将返回的行增加1;这并不能解决问题。