【问题标题】:Is it possible to put JS scripts in PHP File?是否可以将 JS 脚本放入 PHP 文件中?
【发布时间】:2012-06-24 10:27:35
【问题描述】:
<?php

mysql_connect('localhost','root','');
mysql_select_db('ditwhales');

$studno=$_POST['studno'];

$command=mysql_query("SELECT * FROM chat WHERE studno= 

'$studno'");
$numrs=mysql_num_rows($command);

if ($numrs==0){
print 'Sorry but you are not one of the Whales. Please contact the web 

master and ask for registration of your Student No. Thank you!';
}

else{
$all=mysql_query("SELECT * FROM msgs");

while ($row=mysql_fetch_array($all)){

echo $row['message'] . "<br />";

};
}




?>

我有这个代码。但问题是我希望 else 每 1 秒刷新一次。这甚至可能吗?我认为返回功能会起作用,但我不知道如何使用它。有人可以帮忙吗?

【问题讨论】:

  • 每 1 秒?确实需要每 1 秒刷新一次,想象一下 10000 个用户 x 1 秒 = 10000 个请求 x 60 秒 = 60000 个请求每分钟,这对我来说是垃圾邮件,最好每 30 秒增加一次刷新或使用 websockets 将更新推送到客户端。

标签: php html refresh


【解决方案1】:

您可以每 1 秒使用 javascript ajax 加载 php 文件,也可以使用无限循环并设置 sleep(1);每 1 秒刷新一次

【讨论】:

    【解决方案2】:

    按照 Mohammad 的建议,您可以针对此问题使用客户端脚本调用服务器上的 php 文件定位并返回答案,例如:

    <script type="text/javascript">
    function callphp(){
        setTimeout('callphp()', 1000);
        xmlhttp = null;
        count = 0;
        var d = new Date();
        if (window.XMLHttpRequest){
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else{
            // IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    RndString = d.getFullYear() + "" + d.getMonth() + "" + d.getDate() + ""  + d.getHours() + "" + d.getMinutes() + "" + d.getSeconds() + "" + count++;
        xmlhttp.open("GET",'file.php?C=' + RndString,false);
        xmlhttp.send(null);
        if(xmlhttp.responseText != ""){
            document.getElementById("div").innerHTML = xmlhttp.responseText;
            }
    }
    </script>
    

    请检查一下,让我们知道发生了什么。

    【讨论】:

      【解决方案3】:

      你的角色有点令人困惑:php 运行服务器端,它返回你显示给客户端的数据,通常是浏览器直接显示的完整 HTML,但它也可以只返回各种格式的数据,例如 json或XML,当您将它用作RPC 的提供者时,这是一种通过php 文件端点调用函数并让它返回数据的奇特方式。

      如果您想控制客户端(通常是网络浏览器)如何与用户交互,那么您需要编写在特定上下文中交互的代码,对浏览器执行此操作的统一方法是使用 @987654324 @。

      使用 javascript,您可以通过使用 setInterval 以多种方式使您的页面(交互)处于活动状态,例如每 X 秒调用一次例程。

      var cMR;
      
      function callMyResults(){
      }
      
      window.onload = function(){
          cMR = setInterval('callMyResults',5000);
      }
      ;
      

      要在页面加载时自动调用您的代码,我们将一个函数附加到 onLoad 事件处理程序,这将执行分配给它的函数中的所有内容,在我们的例子中,它将设置 5000 毫秒的时间间隔它将每次执行 CallMyResults() 函数。 setInterval 的结果保存在 cMR 全局中,以便以后可以在需要时停止在间隔上执行的代码。

      所以目前这段代码什么都不做。 Javascript 可以调用其他页面,从而通过现在统一称为AJAX 的东西来检索数据,最初这意味着检索您随后操作的 XML 文档(或者只是将wrote 放入当前显示的文档中)。后来这已经演变为使用 json,因为它返回一个 javascript 原生元素,使其更易于使用并且通常更小,以通过网络连接传输,这使得页面更快捷。

      存在许多库可以轻松地做到这一点,最流行的库之一是jquery,但您也可以使用XMLHttpRequest 对象(AJAX 的基础)编写自己的调用。你会在网上找到很多这样的例子,比如retrieving json data。

      一般而言,建议您使用已建立的库,以便于使用、保持您自己的理智以及更好、更容易访问的编码。

      最后,在 PHP 端,您只需像往常一样收集数据,但打印数据略有不同,可以是您自己指定格式的 XML,也可以使用 json_encode 将其返回为 json。这可以像下面这样简单:

      <?php
      $pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1',$user,$password);
      $result = $pdo->query('SELECT * FROM msgs');
      print json_encode($result->fetchAll());
      

      请注意,我使用 PHP Data Objects(通常称为 PDO)来访问数据库,这提供了一种访问数据库的统一方式,以防您切换到另一个 RDBMS 而不是您正在使用的那个目前(mysql)。在这种情况下,您需要调整的是您在实例化 PDO 对象时提供给它的 DSN 字符串。 PDO 的另一个非常大的优点是,它通过提供方法来轻松创建 prepared statement 来保护您免受 SQL injection 的侵害,您向该 parameters 提供自动引用(并因此受到保护)的 parameters;不再推荐使用 mysql_* 系列函数:要么使用 PDO,要么使用 mysqli。

      所以,给你一个工作的例子:

      我们有 1 个客户端页面:display.html 和 2 个用于生成和返回数据的服务器端页面(fillList.php 和 retrieveList.php)

      fillList.php

      <?php
          // we work with the following table
      // create table list_data (`when` DATETIME NOT NULL);
      
          // make sure to adapt these settings to yours, including username and password
      $pdo = new PDO('mysql:dbname=scratch;host=localhost','username','password');
      $pdo->exec('INSERT INTO list_data VALUES (NOW())');
      

      这将在list_data 表的when 列中插入一个新值

      retrieveList.php

      <?php
          // make sure to adapt these settings to yours, including username and password
          $pdo = new PDO('mysql:dbname=scratch;host=localhost','scratch','scratch');
          print json_encode($pdo->query('SELECT `when` FROM list_data 
                                         ORDER BY `when` DESC'
                                        )->fetchAll(PDO::FETCH_ASSOC)
                            );
      

      检索在list_data 表中找到的所有值,按降序排列,并将生成的关联数组作为 json 对象返回。

      我决定向您展示一个使用 jquery 的示例客户端页面,确保您下载最新的 jquery-1.7.2.js 并将其放在与此文件相同的目录中。

      display.html

      <html><head><title>Refreshing List</title>
      <script src="http://localhost/jquery-1.7.2.js" />
      </head>
      <body>
      
      <p>this list refreshes every 5 seconds, a new value is inserted every 2 seconds</p>
      <ul id="toRefresh">
      <li>base</li>
      </ul>
      <script>
      
      function fillList(){
        // we insert a new value in the database by calling fillList.php
        $.get("http://localhost/fillList.php");
      }
      
      function refreshList(){
        /* 
          we retrieve the json encoded data returned by retrieveList.php 
          and process it in our anonymous function
        */
        $.getJSON("http://localhost/retrieveList.php",function (data){
          var items = [];
      // loop through the returned array
          $.each(data,function(key,val){
            // we passed an associative array so we can use the columnname: 'when'
            items.push("<li>when: " + val['when'] + "</li>");
      });
          // clear the list and append the data to it
      $("#toRefresh").empty();
      $("#toRefresh").append(items.join(''));
        });
      }
      
      // jquery uses .ready() instead of window.onload = function(){}
      $(document).ready(function (){
        // retrieve the data every 5 seconds
        setInterval(function(){refreshList();},5000);
        // insert additional new data every 2 seconds
        setInterval(function(){fillList();},2000);
      
        // we fill the list with its initial values
        refreshList();
      
      });
      </script>
      </body>
      </html>
      

      如您所见,jquery 为您提供了一种简单的方法来执行这些操作。运行 display.html 页面,你会看到一个不断增长和刷新的 mysql 日期时间值列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2018-06-01
        相关资源
        最近更新 更多