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 を取得し、単一のクエリを実行する 2 番目のファイルにパラメーターとして渡すことができます。これらの ID を JavaScript 配列に格納します。

これを行う関数を作成し、最初の ajax が完了したら、id 配列の 2 番目の要素に移動し、2 番目のパラメーターで別の 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 関数を宣言します。このようにして、一度に 1 つの ajax だけが実行されるようにし (サーバーが爆発しないように)、かなり正確に進行することができます。この ajax 関数は次のことを行います。

  • ajax.php?id=xxx にリクエストを送信します。ここで、xxx は JavaScript 配列内の ID の 1 つです。
  • ファイルでは、id ( $_GET['id']) を取得し、古いデータベースから取得して、新しいデータベースに挿入します。こちらは1エントリーのみとなります。
  • ajaxが完了すると、done()関数に移動します。最後の要素で関数を開始するのでdoAjax()、次の反復を行いますdoAjax(i-1)。配列を逆方向に進むため、キーが正かどうかを確認します。そうでない場合、スクリプトは停止します。

それはそれについてです。

于 2013-01-16T08:22:21.440 に答える
0

できません。php は最初にサーバーによって解釈され、次に HTML コードとしてユーザーに送信されます。
唯一の可能性は、html ページを作成し、AJAX で php スクリプトを呼び出すことです。

于 2013-01-16T08:19:57.093 に答える