javascript - 升级我的 PHP 聊天系统? (让它只更新新消息?)

标签 javascript php jquery ajax

JS:

"use strict";

$(document).ready(function () {
    var chatInterval = 250; //refresh interval in ms
    var $userName = $("#userName");
    var $chatOutput = $("#chatOutput");
    var $chatInput = $("#chatInput");
    var $chatSend = $("#chatSend");

    function sendMessage() {
        var userNameString = $userName.val();
        var chatInputString = $chatInput.val();

        $.get("./write.php", {
            username: userNameString,
            text: chatInputString
        });

        $userName.val("");
        retrieveMessages();
    }

    function retrieveMessages() {
        $.get("./read.php", function (data) {
            $chatOutput.html(data); //Paste content into chat output
        });
    }


    $chatSend.click(function () {
        sendMessage();
    });

    setInterval(function () {
        retrieveMessages();
    }, chatInterval);
});

写入.php:

<?php
require("connect.php");

//connect to db
$db = new mysqli($db_host,$db_user, $db_password, $db_name);
if ($db->connect_errno) {
    //if the connection to the db failed
    echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
}


//get userinput from url
$username=substr($_GET["username"], 0, 32);
$text=substr($_GET["text"], 0, 128);
//escaping is extremely important to avoid injections!
$nameEscaped = htmlentities(mysqli_real_escape_string($db,$username)); //escape username and limit it to 32 chars
$textEscaped = htmlentities(mysqli_real_escape_string($db, $text)); //escape text and limit it to 128 chars



//create query
$query="INSERT INTO chat (username, text) VALUES ('$nameEscaped', '$textEscaped')";
//execute query
if ($db->real_query($query)) {
    //If the query was successful
    echo "Wrote message to db";
}else{
    //If the query was NOT successful
    echo "An error occured";
    echo $db->errno;
}

$db->close();
?>

读取.php

<?php
require("connect.php");

//connect to db
$db = new mysqli($db_host,$db_user, $db_password, $db_name); 
if ($db->connect_errno) {
    //if the connection to the db failed
    echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
}


$query="SELECT * FROM chat ORDER BY id ASC";
//execute query
if ($db->real_query($query)) {
    //If the query was successful
    $res = $db->use_result();

    while ($row = $res->fetch_assoc()) {
        $username=$row["username"];
        $text=$row["text"];
        $time=date('G:i', strtotime($row["time"])); //outputs date as # #Hour#:#Minute#

        echo "<p>$time | $username: $text</p>\n";
    }
}else{
    //If the query was NOT successful
    echo "An error occured";
    echo $db->errno;
}

$db->close();
?>

基本上一切都很完美,除了我想允许人们复制和粘贴,但脚本目前正在做的是在聊天间隔(250MS)更新每条消息。

我怎样才能突出显示一条消息并复制它?

所以我的问题是,我可以这样做吗:

我可以让它只更新每 250-500MS 出现的新消息,而不是更新 HTML 的最后一点,因为这会浪费资源(特别是如果有很多消息)

希望对您有帮助!

附:我不想使用网络套接字

最佳答案

要使其从最后一条消息开始更新,请获取最后一条消息的 ID,然后在下一个 $.get 中包含该消息的 ID,并仅获取之后的消息那个。

然后在 JavaScript 中使用 .append(),这样就不会覆盖整个内容。

关于javascript - 升级我的 PHP 聊天系统? (让它只更新新消息?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183008/

相关文章:

php - MYSQL:创建查询以显示条目的父级/层次结构(面包屑)

javascript - 如何使用 kendo ui 的控件和框架使每个列表项可拖动

jquery 选择器语法 $( [] ) 和 $ ("*")

javascript - 最大高度过渡问题

javascript - 类型错误 : K is undefined

javascript - 检查节点值是否存在于 JavaScript 中

php - 如何从我的 ajax php 函数中获取 html 和 javascript?

javascript - 使用 javascript append 选择选项

php - 使用两种语言时如何决定是使用 JavaScript 还是 PHP 对象?

javascript - 创建 Youtube 背景时出现 JS 错误