我有这个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循环在同一文档中,也可以在另一个文档中更容易。
答案 0 :(得分:1)
您可以执行“master”文件,对第一个文件执行ajax以运行单个查询。您可以在此主文件中获取所有条目ID,然后将其作为参数传递给执行单个查询的第二个文件。将这些ID存储在javascript数组中。
创建一个执行此操作的函数,当第一个ajax完成时,移动到id数组的第二个元素,并使用第二个参数执行另一个ajax。这就是magento进口的方式:)
如果您需要进一步解释,请告诉我,我尽力解释,但可能还不太清楚。
// 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数组,其中包含需要更改的所有ID。
然后我声明了一个递归的ajax函数,这样我们可以确保在任何一次只运行一个ajax(所以服务器不会爆炸),我们可以有一个相当准确的进度。这个ajax函数执行以下操作:
$_GET['id']
),从旧数据库中获取它,并将其插入新数据库中。这只适用于一个条目。done()
函数。由于我们使用最后一个元素启动doAjax()
函数,因此我们执行下一次迭代doAjax(i-1)
。由于我们在数组中向后移动,我们检查密钥是否为正。如果不是,脚本将停止。就是这样。
答案 1 :(得分:0)
你不能。 php首先由服务器解释,然后以HTML-Code的形式发送给用户 唯一的可能是创建一个html页面并用AJAX调用php脚本。