4

我有这个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 循环在同一个文档中,也可以在另一个更简单的文档中。

4

2 回答 2

2

您可以创建一个“主”文件,对第一个文件执行 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 函数执行以下操作:

  • 向 ajax.php?id=xxx 发送请求 - 其中 xxx 是 javascript 数组中的 id 之一。
  • 在文件中,我们得到 id ( $_GET['id']),你从旧数据库中取出它,并将它插入到新数据库中。这仅适用于一个条目。
  • ajax 完成后,它会转到done()函数。由于我们从doAjax()最后一个元素开始函数,我们进行下一次迭代doAjax(i-1)。由于我们在数组中倒退,我们检查键是否为正。如果不是,脚本将停止。

就是这样。

于 2013-01-16T08:22:21.440 回答
0

你不能。php 首先由服务器解释,然后作为 HTML 代码发送给用户。
唯一的可能性是创建一个 html 页面并使用 AJAX 调用 php 脚本。

于 2013-01-16T08:19:57.093 回答