8

首先是应用程序的工作原理:(注意:页面上有多个用户,例如 Patient M、Patient E 等)

1) 患者 X 的姓名旁边是一个标记为Check In的按钮。这是在服务器端记录的。

2) 单击Check In按钮后,用户会看到一个下拉菜单(替换初始按钮),其中包含用户可以选择的多个位置。从选择中选择位置后,服务器端将再次更新。

3)然后用户可能决定选择多个位置,重复步骤 2

4) 最后,当用户选择完位置后,他在用户在步骤 2 和 3 中单击位置的同一个选择中单击Check Out 按钮,标题为 Check Out。单击此按钮后,它将被发送到 checkloc.php 并记录。

5) 最后,下拉菜单消失,出现 Checked Out 字样。

不幸的是,问题在于,如果我现在是计算机 1,并且通过单击签入、选择位置和签出的过程,这与计算机 2 完全不同。

来一张图:

我想要发生的事情

所以基本上我需要一种方法来每隔几秒钟抓取一次服务器代码并用当前值更新表单元素。我是一个相当新的程序员,所以代码和教程会更有帮助。另外,就像我刚才提到的,我是一名新程序员,所以如果我的代码可以以任何方式清理,那就太好了。

感谢您的任何帮助!我很高兴澄清您的任何问题!

继承人的代码:

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>

<script type="text/javascript">
$(document).ready(function() {
$('.locationSelect').hide();  // Hide all Selects on screen
$('.finished').hide();        // Hide all checked Out divs on screen
$('.checkOut').hide();

$('.checkIn').click(function() {
    var $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of button
    // You can map this to the corresponding button in database...
    $.ajax({
        type: "POST",
        url: "checkin.php",
        // Data used to set the values in Database
        data: { "checkIn" : $(this).val(), "buttonId" : data},
        success: function() {
            // Hide the current Button clicked
            $e.hide();
            // Get the immediate form for the button
            // find the select inside it and show...
            $('.locationSelect').show();
            $('.checkOut').show();
        }
    });
});

$('.locationSelect').change(function() {
    $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of select
    // You can map this to the corresponding select in database...
    $.ajax({
        type: "POST",
        url: "changeloc.php",
        data: { "locationSelect" : $(this).val(), "selectid" : data},
        success: function() {
            // Do something here
        }
    });
});

$('.checkOut').click(function() {
    var $e = $(this);
    var data = $e.data("param").split('_')[1] ;
    // gets the id  of button
    // You can map this to the corresponding button in database...
    $.ajax({
        type: "POST",
        url: "checkout.php",
        // Data used to set the values in Database
        data: { "checkOut" : $(this).val(), "buttonId" : data},
        success: function() {
            // Hide the current Button clicked
            $e.hide();
            $('.locationSelect').hide();
            // Get the immediate form for the button
            // find the select inside it and show...
            $('.finished').show();
        }
    });
});

});
</script>

和html:

<button class="checkIn" data-param="button_9A6D43BE-D976-11D3-B046-00C04F49F230">Check In</button>

<form method='post' class='myForm' action=''>
  <select name='locationSelect' class='locationSelect' data-param="location_9A6D43BE-D976-11D3-B046-00C04F49F230">
    <option value="0">Select a location</option>
    <option value='1'>Exam Room 1</option>
    <option value='2'>Exam Room 2</option>
    <option value='3'>Exam Room 3</option>
    <option value='4'>Exam Room 4</option>
  </select>
</form>
<button class="checkOut" data-param="cbutton_9A6D43BE-D976-11D3-B046-00C04F49F230">Check Out</button>

<div class='finished' style='color:#ff0000;'>Checked Out</div>

继承人服务器端代码(我把它分成三页只是为了测试)

签入.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['buttonId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['checkIn'])){
    $checkin = 0;
}


$hostname = 'localhost';

$username = '*******';

$password = '******';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($checkin,$currentlocationstart, $apptid));


?>

locationchange.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['selectId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['locationSelect'])){
    $currentLocation = $_REQUEST['locationSelect'];
}


$hostname = 'localhost';
$username = '*****';
$password = '*******';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($currentlocation,$currentlocationstart, $apptid));

?>

和 checkout.php

<?php

date_default_timezone_set('America/Denver');

$apptid = $_REQUEST['buttonId'];
$currentlocationstart = date("Y-m-d H:i:s"); 

if(isset($_REQUEST['checkOut'])){
    $checkin = 1000;
}


$hostname = 'localhost';

$username = '*********';

$password = '********';


$conn = new PDO("mysql:host=$hostname;dbname=sv", $username, $password);

$sql = "UPDATE schedule SET currentlocation = ?, currentlocationstart = ? WHERE apptid= ? ";
$q = $conn->prepare($sql);
$q->execute(array($checkin,$currentlocationstart, $apptid));


?>
4

4 回答 4

6

您指的是一种称为“心跳”的方法。我将在这里发布一个示例,但首先我想给你一些指示,因为正如你所说,你是一个新开发者:)。

1) 使用 JQuery,尽量避免使用类选择器。它是出了名的慢。尽可能使用 id 选择器,如果不可能,则使用缩小搜索范围的 nodename 选择器。浏览器使用 ID 作为 dom 元素的一种“索引”或“键”,因此它是最快的搜索。

2) 预载!即使您要使用类选择器,也不要这样做

    $('.locationSelect')

一遍又一遍。如果您要多次引用同一个 DOM 元素,请执行以下操作:

    var locationSelect = $('.locationSelect'); //this creates a reference
    $(locationSelect).whatever() //this uses the reference

通过这样做,您只需搜索 DOM 一次。对于较小的应用程序,这似乎没什么大不了的,但是随着您的应用程序变得越来越复杂,在 DOM 中搜索元素需要越来越多的时间。通过使用参考,您只需搜索一次。

3)(可选)我建议使用像 AngularJS(由 Google 编写)这样的 MVC 平台。MVC 或模型视图控制器允许您更新“模型”(基本上是 JavaScript 对象),“视图”(HTML)使用称为 UI 绑定的东西自动调整其值。这是从一开始就开发应用程序的好方法,但如果您已经深入了解简单的简式代码,那么它可能不适合您。我仍然会看看他们的教程,看看它可以为你提供什么: http: //docs.angularjs.org/tutorial/

现在回答你原来的问题!是的,这完全可以通过 jQuery 使用一种称为心跳的方法来实现。心跳允许您模拟服务器和客户端之间的数据持久性。心跳越频繁,您的客户端就越同步,但您的网络服务器上的负载也越大。这是一个平衡的行为。
简而言之,它的工作原理如下:

    setInterval(function(){
        $.ajax({
           url: 'heartbeatscript.php',
           method: 'post'
           //whatever data you want to send
        }).done(function(data){
           //do whatever with the returned result
        });
    },heartbeatInterval); //heartbeatInterval will be however many MS you want    

我还建议使用 JSON 在客户端和服务器之间进行通信。JSON 很容易在两端解析,在客户端它只是解析批量数据的最快机制。JSON 被直接解析为 JavaScript 对象,因为该符号实际上就是 JS 用来在浏览器中存储对象数据的方式。XML 也是一个不错的选择。两者都很容易上手:

客户端:您可以使用 jQuery 解析基本的 XML:

    $('nodeName',xml);

您可以像这样将 JSON 解析为 JSO:

    var JSO = JSON.parse(JSONString);                           
于 2012-11-13T16:18:24.747 回答
5

看看Socket.IO,因为正如网站所说:

什么是 Socket.IO?

Socket.IO 旨在使每个浏览器和移动设备中的实时应用程序成为可能

尽管 Socket.IO 是在 NodeJS/Javascript 中的,但是关于将 PHP 与 Socket.IO 结合使用的讨论颇多

于 2012-11-12T23:23:15.723 回答
2

Web 应用程序的基本原则之一是在客户端启动每个操作,即如果您想更改其中一台计算机上的显示,则必须有人单击该计算机上的某些内容。本来如果服务器出事的话,在第二台电脑上更新显示是没有可能的,现在也还没有解决办法。

然而,随着现代浏览器的发展,已经开发出多种技术,并在 Web 邮件客户端和响应式“Web 2.0”应用程序中广泛使用。您必须决定其中一个并自己实施,每个都有其优点和缺点。

最容易实现的一个(除了一个简单的“刷新”按钮)可能是每隔几秒执行一次 AJAX 请求,并根据服务器报告的当前用户状态更新屏幕。

于 2012-11-10T00:58:09.183 回答
2

基本上,您要做的似乎是在另一台机器上更新来自一台机器的数据,而无需重新加载页面。

很高兴您已经对 AJAX 有所了解,因为这可能是您实现解决方案的方法之一。本质上,您需要的是以某个指定的时间间隔(可能每秒或每隔几秒,取决于您的需要)从网页轮询服务器。您可以使用 AJAX 执行此操作。

当您轮询此服务器时,您可以提取数据(HTML 片段、JSON 数据,以及在您的应用程序中有意义的任何内容)并使用这些数据来更新页面。因此,当用户在计算机 1 上进行更新时,计算机 2 将能够轮询服务器并拉入与计算机 1 上的数据更改相关的更新。

于 2012-11-10T00:59:11.763 回答