Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 升级我的PHP聊天系统?(使其仅更新新消息?)_Javascript_Php_Jquery_Ajax - Fatal编程技术网

Javascript 升级我的PHP聊天系统?(使其仅更新新消息?)

Javascript 升级我的PHP聊天系统?(使其仅更新新消息?),javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,JS: Write.php: "use strict"; $(document).ready(function () { var chatInterval = 250; //refresh interval in ms var $userName = $("#userName"); var $chatOutput = $("#chatOutput"); var $chatInput = $("#chatInput"); var $chatSend = $

JS:

Write.php:

"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);
});

若要使其仅从上一条消息开始更新,请获取上一条消息的ID,然后在下一条
$中获取。获取
包括该消息的ID,并仅获取其后的消息


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

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


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

看起来您已经在使用jQuery了。您可以创建一个PHP脚本,只查询数据库中比最新显示的条目更新的条目,然后使用
$.append
将消息附加到保存它的
(或任何其他元素)中


此外,正如评论员指出的,您可能仍然容易受到SQL注入的影响。正在考虑与一起使用。

看起来您已经在使用jQuery了。您可以创建一个PHP脚本,只查询数据库中比最新显示的条目更新的条目,然后使用
$.append
将消息附加到保存它的
(或任何其他元素)中



此外,正如评论员指出的,您可能仍然容易受到SQL注入的影响。考虑与一起使用。

你是什么意思?我如何让它只更新新消息,你能给我解释得更清楚一点吗?有一个隐藏的输入字段,如so
,然后,每次你轮询新消息时,只包含该字段的值,并且在你的查询中仅获取该字段之后的消息。然后,将结果附加到现有消息中,而不是过度写入。另外,请务必更新该输入字段。@Difster可能更容易避免添加另一个输入字段,只需在每条消息
@wolfson上附加一个
data
属性即可。@wolfson是的,这是聪明的wolfson,它也可以工作@wolfson,但我不想给用户带来全新的复杂性。你是什么意思?我如何让它只更新新消息,你能给我解释得更清楚一点吗?有一个隐藏的输入字段,如so
,然后,每次你轮询新消息时,只包含该字段的值,并且在你的查询中仅获取该字段之后的消息。然后,将结果附加到现有消息中,而不是过度写入。另外,请务必更新该输入字段。@Difster可能更容易避免添加另一个输入字段,只需在每条消息
@wolfson上附加一个
data
属性即可。@wolfson是的,这是一个聪明的wolfson,它也可以工作@wolfson,但我不想给用户带来全新的复杂性。我该怎么做?选择*起始日期?(它如何知道哪些消息是最新的,哪些不是?)如何检测用户已经收到哪些消息,以便只选择新消息?正如@Difster指出的,您只能选择比屏幕上显示的最新消息更新的消息。您的消息表中是否有
id
字段?您可以向保存消息的
添加自定义属性,即

,然后使用jQuery选择器选择最后一个
消息
类并查找其
id
。是的,我有一个id如何做到这一点?选择*起始日期?(它如何知道哪些消息是最新的,哪些不是?)如何检测用户已经收到哪些消息,以便只选择新消息?正如@Difster指出的,您只能选择比屏幕上显示的最新消息更新的消息。您的消息表中是否有
id
字段?您可以向保存消息的
添加自定义属性,即

然后使用jQuery选择器选择最后一个
消息
类并查找其
id
。是的,我每1/4秒有一个IDpoll是愚蠢的,希望不超过5个人使用聊天,如果不是WebSocket,你可以使用服务器发送的事件,这比轮询效率高很多。你也不需要改变太多。在为时过晚之前修复sql injections和XSS。@LawrencerOne如何使用服务器发送的事件?你能给我举个例子吗:没有要求250ms的websocket,真的吗??基本上,您会使用请求对自己的服务器进行ddos攻击。这里的另一个示例是每1/4秒轮询一次,希望不会超过5人使用聊天,如果不是websockets,您可以使用服务器发送的事件,这比轮询效率要高得多。你也不需要改变太多。在为时过晚之前修复sql injections和XSS。@LawrencerOne如何使用服务器发送的事件?你能给我举个例子吗:没有要求250ms的websocket,真的吗??基本上,您可以使用您的请求对自己的服务器进行ddos攻击。这里还有另一个示例
<?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
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();
?>