Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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 使用SSE获取mysql select的响应_Javascript_Php_Mysql_Server Sent Events_Eventsource - Fatal编程技术网

Javascript 使用SSE获取mysql select的响应

Javascript 使用SSE获取mysql select的响应,javascript,php,mysql,server-sent-events,eventsource,Javascript,Php,Mysql,Server Sent Events,Eventsource,我正在尝试使用EventSource创建聊天室1到1的实时连接。我已经设置了我的事件源,根据开发人员工具告诉我的,它是开放的并且可以工作,但是响应数据没有从PHP文件中显示出来 PHP: 任何帮助或指导都将不胜感激。我对SSE比较陌生,但据我所知,这应该是可行的。您的PHP代码有几个问题。最容易解决的问题是,最好将flush()更改为@ob_flush()@flush()。ob_flush()确保PHP没有缓冲任何内容,而@标志只是确保如果没有使用缓冲,您不会收到警告消息 第二个问题是SSE协议

我正在尝试使用EventSource创建聊天室1到1的实时连接。我已经设置了我的事件源,根据开发人员工具告诉我的,它是开放的并且可以工作,但是响应数据没有从PHP文件中显示出来

PHP:


任何帮助或指导都将不胜感激。我对SSE比较陌生,但据我所知,这应该是可行的。

您的PHP代码有几个问题。最容易解决的问题是,最好将
flush()
更改为
@ob_flush()@flush()
ob_flush()
确保PHP没有缓冲任何内容,而
@
标志只是确保如果没有使用缓冲,您不会收到警告消息

第二个问题是SSE协议是最小的,但不是最小的!您需要在邮件前面加上“data:”,并在邮件后面加上“\n\n”。您的HTML不包含任何自己的换行符,所以我认为它会起作用。(除非
$MessageContent
或任何其他动态数据中有换行符…我建议您不仅对回车进行一些数据过滤,而且对HTML标记进行一些数据过滤,因为您当前的代码容易受到嵌入HTML攻击。)


另一种方法:另一种方法是只发送一个JSON对象,其中包含
$MessageRows[“Time”]
$MSender
$MessageContent
等,并让JavaScript客户端创建HTML。这更灵活(例如,不同国家/地区的客户可以拥有自己的邮戳格式,布局可以更改等,而无需触摸后端),但将更多工作转移到前端。

Thank you@Darren Cook,如果你在下面看到,我在发现这些问题后更改了代码,但是我遇到了其他一些问题。目前,我正试图让它发挥作用。一旦做到了,我肯定会进入数据过滤。我没有经常使用JSON来理解如何在这种情况下使用它,我曾经尝试过这样做,但我承认我有点迷路了。
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

session_start(); // Starting Session
include 'dbconnect.php';
include 'Session.php';

$messageuserid = $_GET['messageuserid'];

$RunSqlGM = "SELECT * FROM messages WHERE (SUsername = '$Session_Username' AND RUsername = '$messageuserid') OR (SUsername = '$messageuserid' AND RUsername = '$Session_Username')";
$getmessagethread = mysqli_query($con,$RunSqlGM)or die(mysqli_error());

while($MessageRows = mysqli_fetch_array($getmessagethread)) {
    $MSUsername = $MessageRows['SUsername'];
    $MRUsername = $MessageRows['RUsername'];
    $MSender = $MessageRows['Sender'];
    $MessageContent = $MessageRows['Message'];
    $TimeStamp = date("g:ia \o\\n l jS F Y", strtotime($MessageRows["Time"]));


    if ($MSender === $Session_Username) {
        echo "<table class='messagebubbleright'>";
            echo "<tr><th></th></tr>";
            echo "<tr>";
                echo "<td class='inforight'>$MSender<br>$TimeStamp</td>";
            echo "</tr>";
            echo "<tr>";
                echo "<td class='bubbleright'>$MessageContent</td>";
            echo "</tr>";
        echo "</table>";
        flush();
    } else {
        echo "<table class='messagebubbleleft'>";
            echo "<tr><th></th></tr>";
            echo "<tr>";
                echo "<td class='infoleft'>$MSender<br>$TimeStamp</td>";
            echo "</tr>";
            echo "<tr>";
                echo "<td class='bubbleleft'>$MessageContent</td>";
            echo "</tr>";
        echo "</table>";
        flush();
    }
}
mysqli_close($con); // Connection Closed
?>
function GetMessages(GetMUserID) {
    if (typeof(EventSource) !== "undefined") {
        var source = new EventSource("db/getmessages.php?messageuserid=" + GetMUserID);
        source.addEventListener("open", function() {
            $("#readmessagearea").html("Getting server updates");
        });

        source.addEventListener("message", function(event) {
            $("#readmessagearea").html(event.data);
        });

    } else {
        $("#readmessagearea").html("Sorry, your browser does not support server-sent events...");
    }
}