3

データベース内のテーブルを検索する検索フォームがあります。テーブルには次の列があります。

icao - 名前 - 国

次のクエリを使用して、これらのフィールドを各行の選択オプションに配置するphpがあります。

 public function airportstuff() {
        $query = "SELECT icao, name, country
                FROM phpvms_airports
                ORDER BY icao";

        return DB::get_results($query);
    }

次に、phpは次のとおりです。

 <?php foreach ($airports as $airport)
 {echo '<option value="'.$airport->icao.'">'.$airport->icao.' - '.$airport->name.'</option>';}
                    ?>

これは問題なく動作しますが、国の列を optgroup として使用できるようにしたいので、各国が optgroup であり、その国のそれぞれの空港が正しい optgroup に含まれています。

私はこれを試しました:

<?php
foreach ($airports as $airport)
{
echo '<optgroup label="'.$airport->country.'">';
echo '<option value="'.$airport->icao.'">'.$airport->icao.' - '.$airport->name.'</option>';
?>
<?php echo '</optgroup>';}?>

ただし、すべての空港の optgroup を作成するだけです。

これに関するヘルプは非常に高く評価され、事前に感謝します。

スチュアート

4

1 に答える 1

5

まず、クエリを変更して、country最初に並べ替え、次に で並べ替えますicao

public function airportstuff() {
    $query = "SELECT icao, name, country
            FROM phpvms_airports
            ORDER BY country, icao";
    return DB::get_results($query);
}

次に、これを試してください:

$previousCountry = null;
foreach ($airports as $airport) {
    if ($previousCountry != $airport->country) {
        // close the previous optgroup tag only if this isn't our first time through the loop
        if ($previousCountry !== null) {
            echo '</optgroup>';
        }
        echo '<optgroup label="'.$airport->country.'">';
    }
    echo '<option value="'.$airport->icao.'">'.$airport->icao.' - '.$airport->name.'</option>';
    $previousCountry = $airport->country;
}
// close the final optgroup only if we went through the loop at least once
if ($previousCountry !== null) {
    echo '</optgroup>';
}

ところで: コード内のXSS 脆弱性を回避するには、ビルドしている HTML のすべての動的部分htmlspecialchars()または同様の関数をラップする必要があります。

于 2011-06-13T05:12:56.393 に答える