1

PHP スクリプトが接続してクエリを実行する DB から約 500 行を取得しています。返された行ごとに、表形式で表示します。スクリプトは Firefox で正常に動作し、最終的には IE でも動作しますが、すべてが適切に表示される前に、ユーザーは「このスクリプトの実行を停止してください」というプロンプトを 1 回か 2 回 (そして IE に続行するように指示します..) 表示されます。

これを回避するには、いくつかのデータをブラウザーに送り返す必要があります。これを行う最善の方法は、配列をチャンク/バッチで処理することだと思います。PHP にはarray_chunk関数がありますが、ここでそれを使用する方法を理解するのに苦労しています。

DB 行を取得するには、次を使用します。

$result = mssql_query($query);

...次に、それらを表に表示します。

while($row = mssql_fetch_array($result))
{
  [DISPLAY TABLE ROW IN TABLE]
}

array_chunk を使用して配列を処理する最良の方法は何ですか?たとえば、50 個のチャンクでしょうか?

4

3 に答える 3

1

array_chunkデータベースからすべての情報を取得した後でのみ、役に立ちます。あなたの質問から、スクリプトが配列に設定されているため、データベースからの実際のクエリにぶら下がっていて、その配列全体を処理したいと考えているようです。

loop最初にマスター配列を作成する代わりに、データベースから結果の各行を取得するために使用しているときに、テーブルの各行を出力できます。ただし、スクリプトがクエリを実行するときに、ユーザーはページの読み込みをチャンクで表示する場合があります。

今あなたの質問のトピックから外れています:チャンクでのページの読み込みがあなたにとって理想的ではない場合は、スクリプトが完了するまで、ある種の「読み込み中」メッセージを表示しながら、バックグラウンドで(JavaScriptを使用して)クエリを非同期で実行することを検討できますランニング。次に、結果をページに出力します。

または、500以上の結果すべてを一度に表示しないオプションがある場合は、ページ付けを使用しLIMITOFFSETSQLキーワードを使用してクエリ全体の一部のみを取得できます。次に、結果の次または前のページへのリンクを作成します。これにより、が変更されOFFSETます。

于 2011-01-10T19:45:35.887 に答える
1

一度に大量のデータをブラウザに送信しています。これを適切に実行するには、次のいずれかを行います。

  1. 少ないデータを送信します。 他の回答が示唆するように、SQLLIMITを使用して結果をページ分割し、出力リンクを使用してページ間を行き来します ( /data/page/1/data/page/55/data/page/lastなど)。これには二次的な効果があります。リクエストごとにサーバーで処理するデータが少なくなるため、PHP と SQL の実行速度が向上します。

  2. より小さいブロックでデータを送信します。 行をループしている間、flush();定期的に (行ごとに$n) を呼び出して、ブラウザがさらにフェッチする前にいくつかの結果を表示する時間を与えます。

  3. データを段階的にプルします。また、AJAX を介して小さなビット (一度に 50 行など) で結果をフェッチすることもできます。これを、上記または同様のページネーションの上に置くことができます。

  4. データを小さくします。ブラウザーに返す HTML のサイズを最小限に抑えることも、大きな違いを生む可能性があります。<div>余分なタグ、クラス、IDを削除したり、コンテンツ自体を省略したりできる場合があります(完全な詳細にリンクします)。データをより簡潔な形式 (JSON など) で送信し、JavaScript を使用して展開することもできます。

于 2011-01-10T19:51:07.773 に答える
0

あなたは間違った質問をしていると思います... array_chunk は、チャンクするために完全な配列が必要なので、ここでは最良の選択肢ではありません。エルゴ: すでに結果セット全体を 1 回ループしているはずです。

そこにあるwhileループ内で直接出力しないのはなぜですか?

データを分割する必要があると思われる場合は、外部カウンターを使用してください。ループ内でインクリメントし、MODULO オペランドを使用してその値をチェックします。

$i = 0;
while($row = mssql_fetch_array($result))
{
  if(++$i % 500 == 0) {
    [DISPLAY TABLE ROW IN TABLE]
  }
}
于 2011-01-10T19:38:59.383 に答える