【发布时间】:2017-04-26 16:48:49
【问题描述】:
好吧,也许我在这里遗漏了一些东西,但对于我的生活,我无法完全掌握这一点。我将在本地主机上运行这个 Ajax 长轮询脚本,所以我不担心请求的数量,但我仍然希望让它工作。
我正在运行一个分数管理和显示记分板。
在一个页面上,我有管理员,当你按下一个按钮时,它会在我的表“roster”的“score”列中增加 10 分,其中 class 等于按钮的 class。我没有任何问题正在更新数据库,我们只是在设置全局。
在第二页。我有一个 ajax 调用,当前每秒触发一次并获取最近更新的行,并显示一个弹出窗口,通知用户刚刚在某某的分数中添加了 10 分。
两个问题:
- 每秒都在发射。
- 即使数据库尚未更新,它仍然会触发。
我知道我可以使用 ajax 长轮询来做到这一点,但我只是不知道如何正确地将所有部分连接在一起,以便只有在我们更新数据库时才会触发 ajax 调用。
JS
$(document).ready( function() {
pingScores();
});
var timestamp = null;
function pingScores() {
$.ajax({
type: "GET",
url: "getUpdate.php?timestamp="+timestamp,
cache: false,
async: true,
success: function(data){
var json = eval('(' + data + ')');
var notinyClass = json[2];
var notinyName = json[3];
//$.notiny({ text: notinyName+"<span class='addScore'> +10</span>", width: '100%', image: notinyClass }); - this is the popup API call that I am passing the class and the name to
timestamp = json["timestamp"];
setTimeout("pingScores()", 1000);
}
});
};
PHP (getUpdate.php)
<?php
require "config.php"; //-- storing all login credentials elsewhere
$db = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());
$query = "SELECT * FROM roster ORDER BY last_updated DESC LIMIT 1";
$result = mysql_query($query);
$array = mysql_fetch_row( $result );
echo json_encode($array);
mysql_close();
?>
数据库
|id | last_updated | class | name | score | active |
|-------|--------------------|-------|-------|-------|--------|
| 1 |2017-04-26 09:37:11 | alpha | Alpha | 10 | 1 |
|-------|--------------------|-------|-------|-------|--------|
| 2 |2017-04-26 09:32:59 | beta | Beta | 10 | 1 |
|-------|--------------------|-------|-------|-------|--------|
| 3 |2017-04-26 09:32:59 | delta | Delta | 10 | 1 |
当数据库从ADD指向分数的一系列按钮更新时,PHP看起来是这样的:
<?php
require "config.php";
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$class = $_POST["class"];
$sql = "UPDATE roster SET score = score + '10', last_updated = now() WHERE class = '".$class."'";
if ($conn->query($sql) === TRUE) {
echo "Updated data successfully\n";
} else {
echo $conn->error;
}
$conn->close();
?>
我能够找到的关于如何进行长轮询的每个教程都是从 txt 文件中提取数据,而关于如何从数据库中提取数据的说明并不是最清楚的。我希望得到一些关于如何做到这一点的澄清。
【问题讨论】:
-
您确实看到该特定解决方案是从 txt 文件中提取数据,对吗?
-
您正在混合使用 mysql 和 mysqli 驱动程序。自 v5.5(2013 年 6 月)起,mysql 驱动程序已被弃用,自 v7.0(2015 年 12 月)起已被删除。您也容易受到SQL injection attacks 的攻击。您应该使用mysqli 或PDO 准备好的语句和this post 中所述的绑定参数。
-
我只在本地主机上运行它 - 如前所述,但感谢您提供最佳实践技巧。
标签: php jquery mysql ajax long-polling