我正在尝试模仿Windows"Map Network Drive"下拉菜单的工作方式。我的下拉选项是字母A-Z。根据SQL SELECT语句的结果,我需要显示但禁用那些已经在使用的字母。我可以在下拉列表中获得字母,也可以在下拉菜单中获得SQL结果,但不能同时获得两者的正确组合。
如何在下拉列表中显示字母表中的所有字母,并禁用SQSL SELECT语句中返回的字母?
示例DB
ID | Desc
-----------
A | Desc A
D | Desc D
F | Desc F
J | Desc J
Z | Desc Z
因此,例如,使用上面的示例DB,字母"A、D、F、J、Z"将被显示但被禁用,而字母表中的所有其他字母都是可选的。
这是我目前拥有的代码。这几乎是正确的,但不知何故出了问题。它确实显示了字母表中的每个字母和我的数据库结果(禁用这些结果),但每个数据库结果都会显示字母表中每个字母。再次使用上面的示例DB,下面的代码将为每个结果显示字母"A"到"Z"(5次),每次仅禁用该结果。
<select>
<?php
// SQL select from Example DB table and connection
while ($row = odbc_fetch_array($db)) {
foreach (range('A', 'Z') as $value) {
if ($row['id'] == $value) {
$result = $value.' -- '.$row['desc'];
$dis = "disabled";
} else {
$result = $value;
$dis = "";
}
?>
<option <?php echo $dis; ?>><?php echo $result; ?></option>
<?php
}
}
?>
</select>
我试着移动"while"answers"foreach",但似乎没有按正确的顺序移动。
您需要首先查询数据库中正在使用的字母,然后创建一个从a到Z的循环语句,并将<option>
标记为disabled
或不标记为。
<?php
$inUse = array();
$sql = "SELECT UNIQUE(`ID`) FROM `table` ORDER BY `ID` ASC";
$res = $db->query($sql);
foreach ($drive as $res->fetchObject()) {
$inUse[] = $drive['ID'];
}
// create select list
echo '<select name="drive">';
foreach (range('A', 'Z') as $letter) {
$disabled = (in_array($letter, $inUse)) ? ' disabled="disabled"' : '';
echo '<option value="' . $letter . '"' . $disabled . '>' . $letter . '</option>';
}
echo '</select>';
未测试,但您可以尝试以下操作:
<select>
<?php
$range = range('A', 'Z');
$used = array();
// Fill in used drives along with their descriptions
while ($row = odbc_fetch_array($db)) {
$used[$row['ID']] = $row['desc']);
}
foreach ($range as $value) {
$result = $value;
$dis = "";
if (in_array($value, $used) {
$result .= ' -- '.$used[$value];
$dis = 'disabled="disabled"';
}
?>
<option <?php echo $dis; ?>><?php echo $result; ?></option>
<?php
}
?>
</select>