试图从php获取json的实时百分比

时间:2014-07-04 19:41:42

标签: php jquery json

我正在尝试更新屏幕而不刷新当用户检查但未能完成此操作时更新到数据库中的当前百分比。 问题是在控制台中我收到错误TypeError: a is undefined ..."resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b 并且GET请求重复无限。在get请求中,响应是: {"percentage":null}。另一个问题是,只有当php脚本完成时,GET请求才会加载完成(如获取最终响应)。 我检查了数据库,每次动态刷新数据库时都可以看到更新百分比。所以这不是PHP或SQL的问题,可能是getter.php(打印结果的文件)和json脚本的问题。 请帮我解决这个问题我整天检查了一天+昨天关于如何从数据库实时回显值并尝试了很多例子但是没有完全了解如何做到这一点(这主要与jquery旋钮有关,想在之后实现它成功)。非常感谢您的帮助。

Jquery的:

jQuery_1_11_0('#check').on('submit', function (e) {
    done();

    function done() {
        setTimeout(function () {
            updates();
            done();
        }, 1000);
    }

    function updates() {
        $.getJSON("lib/getter.php", function (data) {
            $("#progressbar").empty();
            $.each(data.result, function () {
                percentage = this['percentage'];
                if (percentage = null) {
                    percentage = 100;
                    $("#progressbar").html(percentage);
                }
            });
        });
    }
});

process.php

$urlsarray = array('google.com', 'yahoo.com', 'bing.com'); 
// this is a dynamic array created by the user, I am giving just a simple example
$counter = 0;
$total = count($urls1);
$session_id = rand(100000000000000, 999999999999999);
$db->query("INSERT INTO sessions (session_id, percentage) VALUES ('$session_id', '$counter')");
foreach ($urlsarray as $urls) {
    doing some things
    $counter++;
    $percentage = ($counter/$total) * 100;
    $db->query("UPDATE sessions SET percentage = '$percentage' WHERE session_id = '$session_id'");       
}
$db->query("DELETE FROM sessions WHERE session_id = '$session_id'");
$percentage = 100;

getter.php

include("process.php");
global $session_id;
$readpercentage = $db->query("SELECT percentage FROM sessions WHERE session_id = '$session_id'");
$percentage = $readpercentage->fetch_assoc();
echo json_encode(array('percentage' => $percentage));
ob_flush();
flush(); 

编辑2更新

function updates() {
    $.getJSON("lib/getter.html", function (data) {
        $("#progressbar").empty();
           $("#progressbar").html(data.percentage);
    });
}

编辑3

var myInterval = setInterval(function(){ updates(); }, 1000);
    function updates() {
        $.getJSON("lib/getter.html", function (data) {
            //$("#progressbar").empty();
            console.log(data);
            $("#progressbar").html(data.percentage);
            if(data.percentage >= 100){
                clearInterval(myInterval);
            }
        });
    }

编辑4.更改了getter.php

include("process.php");
//global $session_id;
//echo $session_id;
$readpercentage = $db->query("SELECT percentage FROM sessions WHERE session_id = '$session_id'");
$percentage = $readpercentage->fetch_assoc();
$percentage = (int) $percentage['percentage'];
if ($percentage = 100) {
    $percentage = 100;
}
echo json_encode(array('percentage' => $percentage));
ob_flush();
flush(); 

和js脚本

var jQuery_1_11_0 = $.noConflict(true);
jQuery_1_11_0('#check').on('submit', function (e) {

var myInterval = setInterval(function(){ updates(); }, 1000);
    function updates() {
        $.getJSON("lib/getter.html", function (data) {
            var percentage = data.percentage;
            $("#progressbar").html(percentage).show();
            if(percentage >= 100 || typeof percentage !== 'undefined'){
                clearInterval(myInterval);
            }
        });
    }
});
// second script is for posting the result
jQuery_1_11_0('#check').on('submit', function (e) {
    var validatef = $("#url").val();
    var validaterror = $('#errorvalidate');
    if (validatef == 'Enter Domains Separated By New Line -MAX 100 DOMAINS-') {
        validaterror.text('Please enter domain names in the text area');
        e.preventDefault();
    } else {
        validaterror.text('');
        $.ajax({
            type: 'post',
            url: 'lib/process.php',
            data: $('#check').serialize(),
            success: function (data) {
                $("#result").html(data); // apple
                // $("#progressbar").knob().hide();
            }
        });

        e.preventDefault();

    } // ending the else
});

2 个答案:

答案 0 :(得分:2)

查看您从PHP发送回JS代码的内容:

echo json_encode(array('percentage' => $percentage));

字面意思是

{"percentage":42}

在你的JS代码中,你有:

    $.getJSON("lib/getter.php", function (data) {
                                          ^^^^---the data coming back from PHP
        ....
        $.each(data.result, function () {
                    ^^^^^^---since when did you put a "result" key into your array?

要使这个JS代码起作用,你必须要做

echo json_encode(array('result' => $percentage));
                        ^^^^^^---note the new key.

请注意,由于您使用单个键:值对发送回JSON中的SINGLE对象,因此使用内部$.each()循环几乎没有意义。你也可以

$("#progressbar").html(data.percentage);

答案 1 :(得分:2)

我无法帮助但想知道:

done();

function done() {
    setTimeout(function () {
        updates();
        done();
    }, 1000);
}

此递归如何停止?因为对我而言,这种超时似乎会永远持续发射。你真的需要一个timeInterval,将它设置为一个变量,并在达到100%时清除间隔。

也许用以下内容替换上述内容:

var myInterval = setInterval(function(){
    updates();
}, 1000);

然后,在更新功能

if(percentage >= 100){
    clearInterval(myInterval);
}

顺便说一下,做:

if(percentage = null){
    ...
}

你的意思是比较使用=而不是==?如果要验证百分比是否已设置且是否为有效数字,则可能最好这样做:

if(typeof percentage !== 'undefined' && !isNaN(parseFloat(percentage)){
    ...
}