2

我正在制作一个现场讨论表格。该页面从 MySQL 加载线程,并通过 AJAX 每 4 秒刷新一次。在每个线程的最后一条评论之后,有一个用于评论的文本输入(非常类似于 Facebook)。

一切正常,除了当用户在输入中写入并且页面刷新时,消息消失了。安全和隐私是这个项目的主要目标,这就是我不想使用 cookie 的原因。我尝试了很多解决方案,并搜索了几个小时的解决方案,但似乎没有任何效果。

  1. $_post每次刷新页面时是否有可能的解决方案?
  2. 如果缓存输入的值并从本地存储中检索它们$_session,任何人都可以提出更具体的方法吗?即:将听众放在哪里:)
  3. 如果输入的值与“”不同,我尝试制作一个防止重新加载页面的功能,但即使这对我也不起作用。

这是我的刷新代码:

<script type="text/javascript">
    var PHP = "msgboard.php";  

    function updateShouts(){
        $('#msgboard').load(PHP);       
    }

    window.setInterval( "updateShouts()", 4000 );
</script>

这是主要的 PHP 函数:

while($row = mysql_fetch_array($resultados)) { 

    echo '<div class="post">
            <div class="user"><b>'.$row["user"].'</b></div>';
    echo '  <div class="txt">'.$row["msg1"].'</div>
          </div>';

        $sql2="SELECT * FROM table WHERE masterid = '".$row['id']."'ORDER BY id ASC";
        $resultados2 = mysql_query($sql2);
        while($row2 = mysql_fetch_array($resultados2)) { 
            echo '<div class="comment">
                    <div class="txt"><b>'.$row2['user'].'</b>';
            echo '  '.$row2['msg1'].'</div>
                  </div>';
        }

    echo '<div class="commentform">
            <form action="board.php" method="post">
            <input type="text" size="75" name="message" id="message1">
            <input type="hidden" name="masterid" value="'.$row['id'].'">
            <input type="submit" name="Submit" value="Enviar"></form>
        </div>' ;
}

提前致谢!

4

2 回答 2

0

也许您应该研究有状态的 HTTP 连接。因此,每当有新消息添加到服务器端的板上时,都会通知所有客户端。这样,您不必不必要地刷新页面。HTML5 支持的 Web Sockets 使之成为可能。以下是我遇到的一些您可能会觉得有用的链接:

使用 HTML5 Web Sockets Wikipedia Page on WebSocket创建与 PHP 服务器的双向连接

socketo.me

于 2012-12-12T22:36:05.570 回答
0

正如@aziz 在评论中指出的那样,如果您只想更新评论,您只需要更新页面的那一部分。

第 1 步:将容器添加到评论中,以便您可以将更新定位到该容器

您会注意到代码中现在有一个新的 div<div id="comments_contaner">将包含所有注释。

此外,当您输出 HTML 时,<?= $variable ?>如果您需要在 HTML 中放置 PHP 变量,只需关闭 PHP 标记并使用它会更容易/更易读。

msgboard.php:

<?
while($post = mysql_fetch_array($resultados))
{
?>
    <div class="post">
        <div class="user"><b><?= $post["user"]?></b></div>
        <div class="txt"><?= $post["msg1"]?></div>
    </div>
    <div id="comments_contaner">
<?
    // This code can be ommited as you can just call updateShouts() upon page load to fetch the comments
    $comments = mysql_query("SELECT * FROM table WHERE masterid = '{$post['id']}' ORDER BY id ASC");
    while($comment = mysql_fetch_array($comments))
    {
?>
        <div class="comment">
            <div class="txt"><b><?= $comment['user'] ?></b> <?= $comment['msg1'] ?></div>
        </div>
<?
    }
?>
    </div>
    <div class="commentform">
        <form action="board.php" method="post">
            <input type="text" size="75" name="message" id="message1">
            <input type="hidden" name="masterid" value="<?= $post['id'] ?>">
            <input type="submit" name="Submit" value="Enviar">
        </form>
    </div>
<?
}
?>

第 2 步:创建一个 PHP 函数来更新评论

这个函数只会输出评论,它需要masterid作为参数知道要输出哪些评论。

更新评论.php:

<?
    $masterid = $_GET['masterid']
    $comments = mysql_query("SELECT * FROM table WHERE masterid = '{$masterid}' ORDER BY id ASC");
    while($comment = mysql_fetch_array($comments))
    {
?>
        <div class="comment">
            <div class="txt"><b><?= $comment['user'] ?></b> <?= $comment['msg1'] ?></div>
        </div>
<?
    }
?>

第 3 步:在针对容器 div 的脚本中调用 PHP 更新函数

您需要$row['id']在 URL 中作为参数传递

<script type="text/javascript">
    var PHP = "updateComments.php?masterid=<?= $post['id']?>";  

    function updateShouts(){
        $('#comments_contaner').load(PHP);       
    }

    window.setInterval( "updateShouts()", 4000 );
</script>

PD:我没有测试过这段代码,它只是向你展示主要思想。

编辑:更正变量名称并添加注释。

于 2012-12-13T00:00:55.097 回答