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>
我有一个数据库,其中保存了绘图 (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>