Пытаюсь получить текущий процент через json из php

#php #jquery #json

#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} . Дополнительная проблема заключается в том, что GET-запрос завершает загрузку (например, получение окончательного ответа) только после завершения php-скрипта. Я проверил базу данных, и каждый раз, когда я динамически обновляю базу данных, я вижу процентное обновление. Так что это не проблема из 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
});
  

Ответ №1:

Я не могу не задаться вопросом:

 done();

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

Как эта рекурсия прекращается? Потому что мне кажется, что этот тайм-аут будет срабатывать вечно. Здесь вам действительно нужен интервал времени, установите его в переменную и очистите интервал, когда будет достигнуто 100%.

Возможно, замените приведенное выше на:

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

затем в функции обновлений

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

Кстати, делая:

 if(percentage = null){
    ...
}
  

Вы имели в виду сравнение с использованием = вместо == ? Если вы хотите убедиться, что процент установлен и является допустимым числом, вероятно, было бы неплохо сделать:

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

Комментарии:

1. верно, это то, что я пытаюсь выяснить, как добавить setinterval в мою функцию

2. Просто замените свой вызов done(); и саму функцию done() на блок, который я создал сразу после, с интервалом времени, он должен сделать то же самое. А затем просто остановите интервал, вызвав clearInterval (myInterval); когда вы хотите, чтобы он прекратил обновление.

3. Обновлено РЕДАКТИРОВАНИЕ 3, теперь функция выглядит так. пробовал также только с переменной data, но теперь я вижу, какая консоль. журнал возвращается и возвращает null. для обоих: console.log (данные); и console.log (данные.процент); и именно поэтому выполняется бесконечно.

4. Хорошо, если ваша переменная data равна null, это означает, что вы ничего не получаете в ответ от вызова ajax. Сначала у вас был $.getJSON («lib/getter.php «, функция (данные) { была вашим вызовом при публикации вашего вопроса, но каким-то образом вы изменили ее на $.getJSON («lib/getter.html «, функция (данные) { Попробуйте изменить его обратно на расширение .php (что, вероятно, вы и имели в виду, поскольку вы ничего не опубликовали относительно файла .html.

5. Да, добавлено if(data.percentage >= 100 || typeof data.percentage !== 'undefined'){ , и бесконечный цикл исчез, потому что действительно возвращает null, но не понимаю, почему, в getter php все, кажется, в порядке

Ответ №2:

Посмотрите, что вы отправляете обратно в свой JS-код из PHP:

 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 с одной парой ключ: значение, в буквальном смысле нет смысла использовать ваш внутренний $.each() цикл. С таким же успехом вы могли бы иметь

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

Комментарии:

1. Отредактировано, как вы сказали (вместо редактирования php отредактировал json, проверьте EDIT 2), и теперь я больше не получаю ошибку, но я все еще не получаю значение из php, и запросы get работают бесконечно. Я очень ценю вашу помощь. У вас впечатляющая репутация.

2. сделайте console.log(data) в коде JS, чтобы точно увидеть, что возвращается с сервера. затем начните выяснять, в чем проблема. Кроме того, ваш setTimeout, вероятно, должен быть просто setInterval, который предназначен для повторных вызовов. В нынешнем виде у вас нет возможности ОСТАНОВИТЬ ваши вызовы update, когда все действительно сделано. Вы будете просто продолжать загружать сервер раз в секунду, пока браузер не завершит работу / не выйдет из строя / не перейдет в другое место.

3. Хорошо, консоль. журнал не помогает, потому что они работают бесконечно, не останавливаясь, чтобы получить ответ. Основываясь на моем коде, как мне выполнить setinterval, пытаюсь выяснить, но у меня все размыто (я не эксперт в jquery)

4. settimeout / setinterval являются встроенными в JS функциями. jquery не требуется.

5. Почти готово, если у вас есть время, пожалуйста, проверьте ПРАВКУ 4 и последний комментарий из ответа Виктора.