【问题标题】:fetching data from mysql with jquery使用 jquery 从 mysql 中获取数据
【发布时间】:2011-01-13 23:51:04
【问题描述】:

我想在不使用 jQuery 刷新页面的情况下从 mySQL 获取一些数据。如果mysql表中的任何记录被更新,有人可以告诉我如何获取数据。例如,以下代码从数据库中获取一个数字计数,如果有人在数据库中添加一个数字并且它被更新,我如何在不刷新页面的情况下显示新数字?谢谢。

<?
$query  = "SELECT number, name FROM members WHERE id=1";
$result = mysql_query($query);

$row = mysql_fetch_array($result);
$number = $row['number'];    ?>

【问题讨论】:

  • 你不想直接这样做。您想使用 jQuery 向 PHP 脚本发出 Ajax 请求,然后由 PHP 脚本发出数据库请求。 JQuery Ajax 文档:api.jquery.com/jQuery.ajax

标签: jquery mysql


【解决方案1】:

已经提到过两次了,但我还是想强调一下。您永远不会希望客户端能够直接访问数据库。这是一个严重的安全风险。

现在来解决问题。首先,您需要设置一个可以使用 ajax 请求的 PHP 文件。我们称之为check.php,它看起来像这样:

<?php
// include necessary files to enable connection to the database
$query  = "SELECT number, name FROM members WHERE id=1";
$result = mysql_query($query);

$row = mysql_fetch_array($result);
$number = $row['number'];

// send correct content type header of json
header("Content-Type", "application/json");

// we create an array, and encode it to json
// then echo it out while killing the script
die(json_encode(array('numbers'=>$number)));

现在到 JavaScript。该解决方案类似于 Kyle Humfeld 的解决方案,但不会使用 setInterval,因为这是一个非常糟糕的做法。这背后的原因是setInterval 不会关心您的 ajax 调用的状态,无论它是否已完成。因此,如果服务器出现问题,您最终可能会收到堆叠请求,这并不好。

因此,为了防止这种情况,我们改为使用 ajax 方法的 success-callback(.getJSON 本质上是 .ajax 的简写)和 setTimeout 的组合来创建称为 polling 的东西:

$(function(){
    // placeholder for request
    var request = null;

    // request function
    var check = function() {
        request = $.getJSON('check.php', function(data){
            // this will log the numbers variable to the dev console
            console.log(data.numbers);
            // initiate a timeout so the same request is done again in 5 seconds
            setTimeout(check, 5000);
        });
    });

    // initiate the request loop
    check();

    // if you want to cancel the request, just do request.abort();
});

此外,还有一个更高级的解决方案,使用 comet server 将数据从服务器推送到客户端,但在深入研究彗星之前,您应该先尝试使上述方法正常工作。如果您想阅读该主题,我建议您查看APE

【讨论】:

  • 非常感谢您提供如此详细的答复。我只是想知道每隔几秒钟向数据库发出请求是否会使用大量数据库资源?例如,如果每隔几秒钟在 10000 个用户页面上请求 10000 个数据?另外,如果更新可能不那么频繁,我的愚蠢问题是,是否只能在特定时间后发送请求?只有在数据库中更新了某些记录时,才没有办法获取数据?再次感谢。
  • @Lucka,如果没有在后台进行某种轮询,恐怕您无法让您的客户知道对数据库进行的更新。如果您倾向于拥有那么多用户,我会提倡使用彗星服务器的推送解决方案。我使用nginxhttp push module 来做类似的事情,但像往常一样,这一切都取决于个人喜好。希望这会有所帮助!
  • 很好的答案,但我很好奇这如何让您解决自产 DDoS 攻击的问题。如果让 1000 个用户同时执行此操作,这与 setInterval 的效果不大致相同吗?每个用户不会每 5 秒进行一次民意调查吗?如果是这样,那与使用 setInterval 做同样的事情有什么本质不同?我不喜欢 setInterval 或任何东西,我只是没有看到这种方法比那种方法有巨大的优势。请帮我理解。谢谢! =)
  • @Kyle,此方法将在服务器响应 5 秒后发出请求,并且仅当它响应时。所以它不会像setInterval 那样敲击请求。如果负载太高,服务器将需要更长的时间来响应,这意味着这 5 秒实际上是 5 秒 + 服务器响应的时间。希望这能让事情更清楚:)
【解决方案2】:

正如@Pekka 所提到的,您需要对执行 db 调用的 PHP 页面进行 AJAX 调用。但是,看起来您的问题比这要复杂一些,因为您想在插入新记录时定期检查并更新(部分?)您的页面,对吧?

如果是这样,您应该可以使用setInterval() 来执行此操作。它是一个原生 javascript 函数,基本上只是设置一个间隔(以毫秒为单位),然后运行一些代码。使setInterval()setTimeout() 不同的是setInterval() 重复运行,直到您告诉它停止(使用clearInterval())。

因此,您可以使用它每 30 秒(或任何您喜欢的)进行一次 AJAX 调用,以查找新记录并相应地更新结果 div。

【讨论】:

  • 请不要容忍使用setInterval()。这是一个非常糟糕的做法!我将展示一个更好的解决方案。
  • setInterval 有它的优点和缺点,其他选项(如长轮询)也是如此。如果不了解更多关于 OP 设置的信息,我不会直接忽略它。
  • @zaius,无论如何,在轮询时使用setInterval 总是不好的。我希望我的回答已经足够清楚了,否则请阅读此article by Colin Snover
  • 哦,我以为你只是在提倡反对投票。尽管如此,对于您的解决方案,这取决于您认为哪个更糟 - 请求排队,或投票因错误而中断。不过,这可以通过错误处理程序来解决。
  • @zaius,对不起,如果我的第一条评论有点模糊。好吧,排队请求不是我理解你为什么想做的事情。想象一下有几百人这样做,服务器最终会崩溃。这就像某种自产的 DDoS。但我完全同意错误处理。也许我不应该把那部分排除在外;)
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2013-04-11
  • 2018-10-20
  • 2014-02-21
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多