PHP 筛选 html select 选项值(如果在数据库中找到)

PHP Filter html select option value if it is found in the database

我有一个数据库,其中保存了绘图 (spots/places)(可以是 5、40、91 等(不递增)) 在我的网站上,我有一个下拉选项,可以选择可用的地块 (0 - 1023)。 我希望在网站上的下拉选择中隐藏在数据库中找到的选项。 因此,如果采用 plot 1,它会在数据库中找到,并且在网站下拉选择中不应该可用。我似乎无法正常工作...

这是我想出的代码。

<label for="plotnumber">Plotnumber :</label></br>
<select name="input_plotnumber">

<?php for ($i = 0; $i <= 1023; $i++) : ?>

$query = ("SELECT plotnumber FROM plot1");
$result = $conn->query($query);
$arrayofplots = mysqli_fetch_all($result);

if (in_array($i, $arrayofplots)) {

}
else {
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
}

<?php endfor; ?>?>
</select>

如果您将 SQL 修改为 select 所有拍摄的地块,您可以决定只输出 option 其值不在该记录集中的元素。根据您对有一列 taken 的评论,您可以这样尝试:

<label>Plotnumber :

    <br />

    <?php
        $sql='select plotnumber from plot1 where taken=1';
        $res=$conn->query($sql);
        $data=$res->fetch_all(MYSQLI_ASSOC);
    ?>


    <select name="input_plotnumber">
        <option selected disabled hidden>Select Plot
        <?php
            for( $i=0; $i < 1024; $i++ ){
                if( !in_array( $i, array_column($data,'plotnumber') ) )printf('<option>%d',$i);
            }
        ?>
    </select>

</label>
  • 需要将mysqli_fetch_all返回的二维数组转换为一维数组,才能使用in_array
  • 由于您有一些列指示是否拍摄了情节,因此您需要将其放在 WHERE 子句中。我用过 taken=1 但如果你有像 taken/not taken 这样的字符串,那么相应地修改它。
  • 避免运行循环中的查询。相反,您应该在顶部获取数据。
  • 根据经验,选择面向对象的风格 $result->fetch_all() 或过程的 mysqi_fetch_all(),而不是两者混合。

更新代码:

<?php

$query = "SELECT plotnumber FROM plot1 WHERE taken=1";
$result = $conn->query($query);
$arrayofplots = $result->fetch_all();

// convert to a 1d array
$arrayofplots = array_map(function($row){
  return $row[0];
}, $arrayofplots);

?>

<label for="plotnumber">Plotnumber :</label></br>
<select name="input_plotnumber">

<?php
for ($i = 0; $i <= 1023; $i++){
  if (!in_array($i, $arrayofplots)) {
    echo '<option value="' . $i . '">' . $i . '</option>';
  }
}
?>

</select>