3

我有一个搜索表单,可以在我的数据库中搜索一个表。该表具有以下列:

国际民航组织 - 名称 - 国家

我有一个 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 回答