Javascript 一个PHP程序中的JS/HTML/PHP和通过服务器发送事件的MYSQL更新

Javascript 一个PHP程序中的JS/HTML/PHP和通过服务器发送事件的MYSQL更新,javascript,php,html,mysql,server-sent-events,Javascript,Php,Html,Mysql,Server Sent Events,我正在构建一个双向聊天应用程序,将消息存储到MySQL数据库中。我希望使用服务器发送的事件,并将PHP和HTML都放在一个页面中,但我面临的问题是标题不能设置为文本/事件流,否则我将破坏HTML 我的问题是,在使用服务器发送的事件时,如何将PHP、JS和HTML放在同一个页面上 这是我的开场白。我将EventSource设置为index.php,尽管这可能是错误的 <html> <head> <meta name="viewport"

我正在构建一个双向聊天应用程序,将消息存储到MySQL数据库中。我希望使用服务器发送的事件,并将PHP和HTML都放在一个页面中,但我面临的问题是标题不能设置为文本/事件流,否则我将破坏HTML

我的问题是,在使用服务器发送的事件时,如何将PHP、JS和HTML放在同一个页面上

这是我的开场白。我将EventSource设置为index.php,尽管这可能是错误的

<html>
        <head>
        <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
        <link rel="stylesheet" type="text/css" href="style.css">
        </head>
        <script>
        if(typeof(EventSource) !== "undefined") {
          var source = new EventSource("index.php");
          source.onmessage = function(event) {
           document.getElementsByClassName("message").innerHTML = event.data;
         };
        }else {
         document.getElementsByClassName("message").innerHTML = "Sorry, your browser does not support server-sent events...";
        }
        </script>
        <h1>LoRa Chat</h1>
        <?php
           $SSE = (@$_SERVER["HTTP_ACCEPT"] == "text/event-stream");
           if($SSE){
            header('Cache-Control: no-cache');
            header("Content-Type: text/event-stream");
           }
           else {
            header("Content-Type: text/html");
           }

            //Database Stuff
            $connect = mysqli_connect('localhost', 'user', 'Pass');
            mysqli_select_db($connect,"allmessages");
            $sql = "SELECT *, if(mymessages > yourmessages, mymessages, yourmessages) FROM lora_messages";
            $results = mysqli_query($connect, $sql);
            while($row = mysqli_fetch_array($results)) {
                if ($row ['mymessages'] > $row ['yourmessages']){
        ?>
        <div class='chat'>
        <div class='mine messages'>
        <div class='message'>
        <?php echo "data: ".$row['mymessages']; flush();?>
        </div>
        </div>
        <?php
            }
               elseif ($row ['mymessages'] < $row ['yourmessages']){
        ?>
        <div class='chat'>
        <div class='yours messages'>
        <div class='message'>
        <?php echo "data: ".$row['yourmessages']; flush();?>
        </div>
        </div>
        <?php
            }
        }
        ?>
        <div class="fixed">
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" Method="POST">
        <input type="text" id="body" name="mymessage">
        <input type="submit" value="Submit" name="submit">
        </form>
        </div>
<br>
</body>
</html>

if(typeof(EventSource)!=“未定义”){
var source=neweventsource(“index.php”);
source.onmessage=函数(事件){
document.getElementsByClassName(“message”).innerHTML=event.data;
};
}否则{
document.getElementsByClassName(“message”).innerHTML=“对不起,您的浏览器不支持服务器发送的事件…”;
}
洛拉聊天

如果在一个文件中保存后,您只需要一个外部If语句来分隔两个逻辑部分

<?php
if ($_SERVER["HTTP_ACCEPT"] === 'text/event-stream') {
 // event stream code

  ...

  while (true) {

  ...

} else {
// client side code
?>
 <head>
        <meta name="viewport" content="w
 ...

<?php }


为什么不改用AJAX呢?我的PHP聊天应用程序使用AJAX,非常高效。我的聊天记录整齐、正确地存储在数据库中!你需要帮助吗?回复我的评论LOL。想看一个视频演示它是如何工作的吗

你说它破坏你的HTML是什么意思?@wuno如果我使用header('Content-Type:text/event-stream'),我只会在我的站点上获得文本(没有HTML),而且当PHP在同一站点上时,SSE似乎也不起作用。执行var source=new EventSource()之类的操作;也不起作用。请阅读:从事件流发回json,将html与
echo”数据混合在一起:
等。它不是那样工作的,EW php;p@LawrenceCherone我不太明白。我已经尝试在EventSource中这样做,但没有效果。我的目的是使用SSE服务器(php)和HTML/JS都集成在一个文件/程序中。我还没有看到这一点。我看到的每个示例都将PHP SSE部分与HTML部分分开。我怎么能不将这两个部分交织在一起呢?我需要循环使用MySQL中的所有变量。您的目的不是首先输出,这就是
$\u服务器[“HTTP\u LAST\u EVENT\u ID”]
是为了让您可以提取或显示初始数据,虽然您可以先做,但不能将其混入其中。不要这样做。您能提供代码以及它在PHP中的工作方式吗?给我一天时间制作文档
<?php
if ($_SERVER["HTTP_ACCEPT"] === 'text/event-stream') {
 // event stream code

  ...

  while (true) {

  ...

} else {
// client side code
?>
 <head>
        <meta name="viewport" content="w
 ...

<?php }
<div class='message'>
 <?php echo "data: $row['mymessages']"; flush();?>
</div>