1

まず、質問を具体的に表現する方法がよくわからないため、私の質問は少し曖昧または混乱していました。編み物会社 (PHP を使用した学校プロジェクト) の仕入業者のデータベースにクエリを実行しようとしていますが、各仕入業者の情報ではなく、見出しとして都市を印刷しようとしています。

現時点で私が持っているものは次のとおりです。

$sql = "SELECT * FROM mc16korustockists where locale = 'south'";
    $result = pg_exec($sql);
    $nrows = pg_numrows($result);
    print $nrows;
    $items = pg_fetch_all($result);
    print_r($items);

for ($i=0; $i<$nrows2; $i++) {
    print "<h2>";
        print $items[$i]['city'];
    print "</h2>";

    print $items[$i]['name'];
    print $items[$i]['address'];
    print $items[$i]['city'];
    print $items[$i]['phone'];

    print "<br />";    
    print "<br />";

}

データベース内のすべてのデータについてデータベースにクエリを実行しています。行はref、name、address、city、phoneであり、実行しています。行数を照会し、それを使用してループを実行する反復回数を決定することはすべて問題ありませんが、h2 見出しが for ($i=0;) 行の上に表示されるようにしたいと考えています。

私のページを壊そうとするだけなので、それは問題外かもしれません。変更が検出されるまで「都市」のエントリ数を数えてから、見出しをその名前に変更する必要があると思いますか?それか、大量のクエリを作成し、各名前の変数を設定しますが、現時点では、手動で行うこともできます (ベスト プラクティスとは思えません)。ああ、私は始めたばかりなので、私の PHP に対する批評を歓迎します。

ありがとうございます。さらに情報が必要な場合は、お問い合わせください。

PS タグでわかるように、私たちのクラスは MySQL ではなく PostgreSQL で学習しています。

4

3 に答える 3

1

これはあなたの問題を解決します:

$sql = "SELECT * FROM mc16korustockists where locale = 'south' order by city";

...


$city = '';

for ($i=0; $i<$nrows2; $i++) {
    if($items[$i]['city']!=$city)
    {
        print "<h2>";
            print $items[$i]['city'];
        print "</h2>";
        $city = $items[$i]['city'];
    }
    print $items[$i]['name'];
    print $items[$i]['address'];
    print $items[$i]['city'];
    print $items[$i]['phone'];

    print "<br />";    
    print "<br />";
}
于 2012-10-29T23:05:23.883 に答える
0

前の項目を見て、同じ都市かどうかを確認します。そうでない場合、または前の項目がない場合は、新しい都市です。

于 2012-10-29T23:05:57.890 に答える
0

あなたがする必要があるのは、都市がいつ変化するかを追跡し、変化したときにそれを印刷することだけです。

変更が発生した場所を確認できるように、提供されたものとできるだけ同じコードを維持しようとしました。

// store previous city, set to NULL by default so the first city from the result set will always be printed 
// (assuming that the first city from the result set is not null).

$previous_city = NULL;

for ($i=0; $i<$nrows2; $i++) {

   // determine what the city is from the current row
   // creating a separate variable for this is not really necessary, but helps to make the example clearer
   $current_city = $items[$i]['city'];

   // check if current city is different to the one in the previous row
   if ($previous_city != $current_city) {
    // city is different, lets print it
    print "<h2>";
        print $items[$i]['city'];
    print "</h2>";
    }

    print $items[$i]['name'];
    print $items[$i]['address'];
    print $items[$i]['city'];
    print $items[$i]['phone'];

    print "<br />";    
    print "<br />";

    // end of loop, the current city, now becomes the previous city
    $previous_city = $items[$i]['city'];

}

1 つの都市のすべてのアイテムがグループ化されるように、SQL で ORDER BY city も必要であることに注意してください。そうしないと、この方法は機能しません。

于 2012-10-29T23:06:00.887 に答える