如何逐步显示数据库结果?

时间:2013-07-20 01:33:41

标签: php jquery mysql ajax curl

我有一个工具可以使用cURL检查游戏中的可用名称,它应该向运行检查的用户显示可用的名称,并且只是关闭所采用的名称。基本上,当您对名称列表运行测试时,它会检查所有名称,并将它们插入数据库并显示其可用性,0表示已获取,或1表示可用。

现在,在检查完成之前页面不会加载,然后它们全部作为整体插入到数据库中。我希望它能动态显示支票的状态(即“Checked name 405/4938”),并在检查名称时显示加载图像,同时在检查时显示可用名称。然后在最后,删除加载图像,并获得现在完整的可用名称列表。

我应该怎么做呢?我对jQuery / AJAX了解不多。现在它们并不理想,它们最终都被展示为质量。

这是名称检查线程上的代码。

<?php
$query = mysql_query("SELECT * FROM `lists` WHERE id = '$id'");
while($row = mysql_fetch_assoc($query)) {

    $id = $row['id'];
    $list = $row['list'];

    foreach(explode("\n", $list) as $listItem) {
        checkname_RS(trim($listItem));
    }
}

这是支票的功能。

<?php   
function checkname_RS($name) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://services.runescape.com/m=hiscore/compare.ws?user1=" . $name);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $output = curl_exec($ch);


    if (stristr($output,"Skill Stats")) {
        mysql_query("INSERT INTO names (name, plat, status) VALUES ('$name', 'Runescape', '0')") or die(mysql_error());
    }
    if (stristr($output,"Member Rankings")) {
        mysql_query("INSERT INTO names (name, plat, status) VALUES ('$name', 'Runescape', '1')") or die(mysql_error());
    }

    curl_close($ch);

}

3 个答案:

答案 0 :(得分:0)

为了实现这一目标,你真的不需要做任何特别的事情。由于您已经只是保持连接打开并将数据转储到文档的底部,因此您应该能够在每个项目或每个n项之后将更多的javascript转储到客户端。

因此,您可以在文档中的某个位置转储一些html,如下所示:

<div id="progressMessage"></div> 
<ul id="availableNames"></ul>

然后你的线程只需要输出js来更新视图,例如(jQuery用于简单):

$("#progressMessage").text("1 of 5999");
$("#availableNames").append("<li>matchedName</li>");

同样适用于加载/隐藏进度条,js在客户端收到它之前不会运行,所以净效果就像进度条。

另见: https://stackoverflow.com/a/2920207/486620

答案 1 :(得分:0)

执行此操作的方法是使用作业队列服务器,使用工作人员(完成工作的任务)和客户端,向工作人员询问流程的完成情况。其中一个是Gearman。

另一种方法是使用cURL自己运行任务,但不要等待完成并使用set_time_limit(0),并自己查询状态,例如,通过在mysql表中保存作业的状态

这里有一些关于多线程的例子:
https://github.com/petewarden/ParallelCurl
http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading

隐式刷新并不总是有效。

希望,它适合你!

答案 2 :(得分:0)

一个天真的解决方案可能是在processed表中维护一个数字list列,您将在每次迭代时更新:

<?php
    // user clicks on "run" (Ajax POST'ing of the input form)

    // load whatever you need from $_SESSION here and then
    session_write_close();
    // so as to allow access to the session to the later Ajax polling

    // reset counter
    mysql_query("UPDATE lists SET processed = 0 WHERE id = $id");
    // then the rest of your current script


    function checkname_RS($name) {
        // your current code here
        // then increment the counter
        mysql_query("UPDATE lists SET processed = processed + 1 WHERE id = $id");
    }

然后有一个Ajax调用轮询数据库,以便检查当前作业的状态。 Ajax调用将从如下脚本中读取状态:

<?php
    // script handling the Ajax call

    // get the number of names already checked
    mysql_query("SELECT processed FROM lists WHERE id = $id");

    // proposed trick to count the number of names in this list
    mysql_query("SELECT CHAR_LENGTH(names) - CHAR_LENGTH(REPLACE(names, '\n', '')) +1 AS cnt FROM lists WHERE id = $id");
    // better computing this number once and for all at the beginning
    // of the process and (eg.) store it in session

    // generate the response to the Ajax call here

结果可以显示在div中,也可以用于更新JQuery UI Progressbar,或以任何方式找到合适的结果。


关于你的结构只有一条建议。始终避免在列中存储非标量数据(例如“\ n” - 分隔的名称列表)。而是每个值存储一行(每个名称一行)。当您规范化数据时,即使对于小型项目,一切都变得更加简单(通常更有效)。