#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 и последний комментарий из ответа Виктора.