1

次のコード ブロックに問題があります。両方を同じページに配置することはできません。そうしないと、最後の 1 つが失敗します (場所が変わっても問題ありません。最後の 1 つが失敗します)。(どちらに関係なく)一方をコメントアウトすると、もう一方が機能します。おそらく実際のコードの問題のようには見えませんか?

これら 2 つを同じページで実行することはできませんか? 私は明らかに何か間違ったことをしているので、それが何であるかを指摘するのを手伝ってください。

while( $test = sqlsrv_fetch_array( $data, SQLSRV_FETCH_ASSOC) ) {
    if ($_GET['unit'] == '15min') { $newDate = $test['dt']->format('H:i:s'); }
    if ($_GET['unit'] == 'hour') { $newDate = $test['dt']->format('m/d H:i'); }
    if ($_GET['unit'] == 'day') { $newDate = $test['dt']->format('Y/m/d'); }
    $dates[] = $newDate;
    $values[] = $test[$pick_graph];
}

そして2つ目

while( $row = sqlsrv_fetch_array( $data, SQLSRV_FETCH_ASSOC) ) {
$newDate = $row['dt']->format('Y/m/d_H:i:s');

    echo    '<tr>'.
            '<td>'.$row['net']."</td>".
            '</tr>';
}

エラーメッセージなどはありません。2 番目のループが実行されると、$data が空か何かであるかのようにループされず、そこにエコーを入れても何も出力されません。

4

2 に答える 2

4

ファイル IO などのコンピューター サイエンスの多くのパターンと同様に、ほとんどのライブラリでのクエリの結果はストリームとして扱われます。結果はそのまま取得できますが、逆方向にスキップすることはできず、クエリを再実行しないと最初からやり直すことはできません。

クエリを再度実行するか、結果を配列にキャッシュすることができます。

$cache = array();
while ($row = sqlsrv_fetch_array($data, SQLSRV_FETCH_ASSOC))
    $cache[] = $row;

次に、質問と同じロジックを実行して、2 つの場所を調べるforeachことができます。$cache

ほとんどの場合、キャッシングの方が適しています。

ただし、非常に大きな結果セット (1000 件) について話している場合は、一度に 1 行ずつ RAM に格納するだけでよいため、クエリを 2 回実行した方がよい場合があります。すでに使用されている行はガベージ コレクションされます。

すべてのパフォーマンスの問題と同様に、それが重要な場合は、両方の方法でプロファイルを作成し、どちらが目的に合っているかを判断してください。

于 2012-12-07T13:46:51.117 に答える
3

私はあなたがsqlsrv_query()一度だけ呼び出していると思います.トラフ結果を2回繰り返したいと思います.

その場合、これは予期された動作であり、望ましい動作です。そうしないと、永遠にループに陥ってしまいます (sqlsrv_fetch_array最終結果に到達すると、最初からやり直すことになります)。

たとえば、MySQLs を見てください。ただし、マニュアルmysql_data_seek()によると、これに代わる SqlSrv はないため、次の 2 つのオプションがあります。

  • クエリを初めて実行するときにすべての結果を配列にキャッシュし、すべての行を反復処理します [おそらくより良い解決策]
  • データをたどるたびにクエリを実行する
于 2012-12-07T13:49:03.817 に答える