我有这个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这个第一文件来运行一个查询。 你可以得到所有的条目ID在这个主文件,然后将其作为参数传递到执行一个查询第二个文件。 在JavaScript阵列存储这些ID。
创建执行此功能,当第一个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
所以,只是为了解释这是什么一样。 它首先宣布了将要被改变的所有ID的全局JavaScript阵列。
然后,我宣布一个递归函数的AJAX,这样我们就可以确保只有一个AJAX在任何单个时间(这样服务器不炸毁)运行,我们可以有一个相当准确的进展。 这AJAX功能执行以下操作:
- 发送到ajax.php请求ID = XXX - ?其中xxx是JavaScript阵列中的ID中的一个。
- 在文件中,我们得到的ID(
$_GET['id']
你把它从旧的数据库,并在新的插入。 这是只为一个条目。 - 当AJAX完成,就转到
done()
函数。 自从我们开始doAjax()
与最后一个元素的功能,我们做下一次迭代doAjax(i-1)
由于我们的数组中的倒退,我们检查,如果关键是积极的。 如果不是,该脚本将停止。
仅此而已。
你不能。 在PHP首先由服务器解释,然后发送给用户的HTML代码。
唯一的可能性是建立一个HTML页面和调用PHP脚本使用AJAX。