У меня есть этот цикл 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 делает следующее:
$_GET['id']
), вы берете его из старой базы данных и вставляете в новый. Это только для одной записи. done()
. Поскольку мы запускаем doAjax()
с последним элементом, мы делаем следующую итерацию doAjax(i-1)
. Поскольку мы возвращаемся назад в массив, мы проверяем, является ли ключ положительным. Если это не так, сценарий остановится. Вот и все.
Вы не можете. Php сначала интерпретируется сервером, а затем отправляется пользователю как HTML-код.
Единственная возможность – создать html-страницу и вызвать php-скрипт с AJAX.