Полоса хода во время работы в цикле

У меня есть этот цикл while, который в основном проходит через множество записей в базе данных и вставляет данные в другой:

$q = $con1->query($users1) or die(print_r($con2->errorInfo(),1)); while($row = $q->fetch(PDO::FETCH_ASSOC)){ $q = $con2->prepare($users2); $q->execute(array($row['id'], $row['username'])) or die(print_r($con2-errorInfo(),1)); } 

(Сценарий был сокращен для удобства чтения – правильный имеет гораздо более длинный массив)

Я хотел бы сделать это более графически и показать индикатор выполнения, насколько он прошел, вместо того, чтобы просто увидеть загрузку страницы в течение нескольких минут (в этом есть ~ 20 000 строк – у меня есть таблицы с гораздо большим количеством данных)

Я получаю, что вы могли бы получить общее количество из старой базы данных, и я мог бы также легко поместить текущий номер в переменную следующим образом:

 $q = $con1->query($users1) or die(print_r($con2->errorInfo(),1)); $i = 0; while($row = $q->fetch(PDO::FETCH_ASSOC)){ $q = $con2->prepare($users2); $q->execute(array($row['id'], $row['username'])) or die(print_r($con2-errorInfo(),1)); $i++; } 

Но теперь мне нужно получить $i и отобразить его – или что-то в этом роде.

Как это «легко» сделано?

Код для индикатора выполнения может быть либо в том же документе, что и в цикле while, либо в другом, если это проще.

Вы можете сделать «главный» файл, который делает ajax для этого первого файла для запуска одного запроса. Вы можете получить все идентификаторы записи в этом главном файле, а затем передать его как параметр ко второму файлу, который выполняет один запрос. Сохраните эти идентификаторы в массиве javascript.

Создайте функцию, которая делает это, и когда первый ajax будет выполнен, перейдите ко второму элементу массива id и выполните еще один ajax со вторым параметром. Вот как импортируется пурпурный путь 🙂

Если вам нужны дополнительные объяснения, дайте мне знать, я изо всех сил старался объяснить, но, возможно, не совсем ясно.

 // you generate this javascript array using php. // let's say you have all the ids that have to be processed in $Ids php array. Ids = [<?php echo implode(',', $Ids); ?>]; function doAjax(i) { $.ajax({ // using jquery for simplicity 'url': "ajax.php?id=" + Ids[i], }).done(function(){ if ( i >= 0 ) { // at the point you know you're at ((Ids.length-i)/(Ids.length) * 100) percent of the script // so you can do something like this: // $('.progressbar').css('width', ((Ids.length-i)/(Ids.length) * 100) + '%'); doAjax(i-1); } }); } doAjax(Ids.length); // starting from the last entry 

Итак, просто чтобы объяснить, что это делает. Он начинается с объявления глобального массива javascript, в котором есть все идентификаторы, которые необходимо будет изменить.

Затем я объявляю рекурсивную функцию ajax, таким образом мы можем убедиться, что только один ajax работает в любой момент времени (поэтому сервер не взорвется), и мы можем добиться довольно точного прогресса. Эта функция ajax делает следующее:

  • Отправляет запрос ajax.php? Id = xxx – где xxx является одним из идентификаторов в массиве javascript.
  • В файле мы получаем идентификатор ( $_GET['id'] ), вы берете его из старой базы данных и вставляете в новый. Это только для одной записи.
  • когда выполняется ajax, он переходит к функции done() . Поскольку мы запускаем doAjax() с последним элементом, мы делаем следующую итерацию doAjax(i-1) . Поскольку мы возвращаемся назад в массив, мы проверяем, является ли ключ положительным. Если это не так, сценарий остановится.

Вот и все.

Вы не можете. Php сначала интерпретируется сервером, а затем отправляется пользователю как HTML-код.
Единственная возможность – создать html-страницу и вызвать php-скрипт с AJAX.