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

问题描述 投票:-2回答:2

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

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

这是我的开头JS。我将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>

编辑:我试图将PHP与HTML分开,并将PHP逻辑部分放在HTML之外。我能够通过Chrome中的检查器获取服务器发送事件,但不确定如何在JS中遍历数据库条目。我对JS语法不满意。

<?php
$SSE = (@$_SERVER["HTTP_ACCEPT"] == "text/event-stream");
if($SSE){
   header("Content-Type: text/event-stream");
   header('Cache-Control: no-cache');
   if(isset($_POST['submit'])){
      $send = $_POST['mymessage'];
      $sendmsg = "INSERT INTO lora_messages (mymessages, yourmessages) VALUES ('".$send."', '')";
   }
   if (!empty($_GET['yourmessage'])){
       $recieve = $_GET['yourmessage'];
       $recievemsg = "INSERT INTO lora_messages (mymessages, yourmessages) VALUES ('', '".$recieve."')";
   }

   $connect = mysqli_connect('localhost', 'root', 'Walcott34');
   mysqli_select_db($connect,"allmessages");
   $sql = "SELECT *, if(mymessages > yourmessages, mymessages, yourmessages) FROM lora_messages";
   $sqlrecieve = mysqli_query($connect, $recievemsg);
   $sqlsend = mysqli_query($connect, $sendmsg);
   $results = mysqli_query($connect, $sql);
   while($row = mysqli_fetch_array($results)) {
       if ($row ['mymessages'] > $row ['yourmessages']){
          echo "data: ".$row['mymessages']."\n\n";
       }
       elseif ($row ['mymessages'] < $row ['yourmessages']){
          echo "data: ".$row['yourmessages']."\n\n";
       }
   ob_flush();
   flush();
  }
}

else {

?>

<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("index2.php");
          source.onmessage = function(e){
              document.getElementById("mymessages").innerHTML = event.data;
              document.getElementById("yourmessages").innerHTML = event.data;

         };
        }else {
         document.getElementsById('message').innerHTML = "Sorry, your browser does not support server-sent events...";
        }
        </script>
        <h1>LoRa Chat</h1>
        <div class='chat'>
        <div class='mine messages'>
        <div class='message'>
        <div id='mymessage'>
        </div>
        </div>
        </div>
        <div class='chat'>
        <div class='yours messages'>
        <div class='message'>
        <div id='yourmessage'>
        </div>
        </div>
        </div>
        <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>

<?php } ?>



javascript php html mysql server-sent-events
2个回答
0
投票

如果将它放在一个文件中,则只需要一个将两个逻辑部分分开的外部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 }

您不能像您所做的那样将两个部分交织在一起:

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

您的服务器端部分不完整,但是超出了问题的范围,我用带有有效示例的链接对此进行了评论。


0
投票

为什么不使用AJAX呢?我的PHP聊天应用程序使用AJAX,它非常有效。我的聊天记录正确整齐地存储在数据库中!你需要帮助?回复我的评论大声笑。想观看有关其工作原理的视频演示吗? Click here

© www.soinside.com 2019 - 2024. All rights reserved.