0

一部の MySQL データを実行するために使用している 2 つの while ループがあります。

最初の while ループは一連のレポートを処理し、テーブルに格納されている「状態」(米国の場合) をチェックします。

そのループ内で、「状態」の while ループを使用して 2 番目のテーブルもチェックしており、状態が一致する場合は、いくつかの情報を配列にプッシュします。ここでは、簡単にするために他のコードを削除しました。

基本的に、最初の while ループから始めて、すべての情報をコンソールに記録し、テーブル内のすべてのエントリを正常にループ処理しました。

次に、ネストされた while ループをそこに配置し、コンソールに警告またはログを記録しようとすると、親ループの最初のエントリのインスタンスのみがループされます。

つまり、$row_wind ループでは、最初のエントリは CT (コネチカット) です。親ループをログアウトすると、そのテーブルにすべてが記録されます (CT が最初のものです)。以下のコードを使用すると、CT だけがログに記録され、次に子ループ内のすべてのエントリが記録されますが、その後の親ループはカウンターされません。while ループを入れ子にすることはできませんか?

while($row_wind = mysqli_fetch_array($sql_wind_result)){
    while($row_alert = mysqli_fetch_array($result_user_alerts)){
        echo "<script>alert('".$row_wind['state']." ".$row_alert['state']."');</script>";
    }
}
4

1 に答える 1

1

mysqli_fetch_arrayarray_pop()は、一度結果をフェッチすると、その結果を再度フェッチしないという点で似ています。

$row_windしたがって、ループは実際には問題なく実行されていると思いますが、2回目の$row_alertループではさらに結果が検索され、すでに実行されていることがわかります(ループ where $row_wind = 'CT')。

$row_wind ループの内側にデバッグ情報を配置し、$row_alert ループの外側に配置すると、違いがわかるはずです。

これを修正するには、内側のループの前に $result_user_alerts クエリを再実行するか、内側のクエリが状態に依存していない場合は、mysqli_fetch_all()事前に実行して内側のループのすべての結果をフェッチする必要があります。フロント、そして結果の配列をforeach()またはで内側のループでループしますwhile()。そうすれば、それらを 1 回フェッチするだけで済みます。

利用できない場合はmysqli_fetch_all()、手動でループできます。

$user_alerts = array();
while($row_alert = mysqli_fetch_array($result_user_alerts)){
    $user_alerts[] = $row_alert;
}

注意事項: ただし、これが構造化されている方法は、いくつかのより良いクエリを使用して実行するほうがよいようです。アプリケーションの詳細はわかりませんが、PHP で 2 つの SQL クエリの値を照合する場合通常、マッチングはデータベースによってより迅速かつ効率的に実行できます。

于 2013-07-11T23:55:27.130 に答える