PHP-模仿;“地图网络驱动器”;下拉菜单工作

PHP-模仿;“地图网络驱动器”;下拉菜单工作,php,sql,drop-down-menu,Php,Sql,Drop Down Menu,我试图模仿Windows“地图网络驱动器”下拉菜单的工作方式。我的下拉选项是字母A-Z。根据SQL SELECT语句的结果,我需要显示但禁用已在使用的字母。我可以在下拉列表中获取字母,或者在下拉列表中获取SQL结果,但两者的组合不正确 如何在下拉列表中显示字母表中的所有字母,并禁用SQSL SELECT语句中返回的字母 示例数据库 ID | Desc ----------- A | Desc A D | Desc D F | Desc F J | Desc J Z

我试图模仿Windows“地图网络驱动器”下拉菜单的工作方式。我的下拉选项是字母A-Z。根据SQL SELECT语句的结果,我需要显示但禁用已在使用的字母。我可以在下拉列表中获取字母,或者在下拉列表中获取SQL结果,但两者的组合不正确

如何在下拉列表中显示字母表中的所有字母,并禁用SQSL SELECT语句中返回的字母

示例数据库

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”和“foreach”,但似乎没有按正确的顺序移动它们。

未经测试,但您可以尝试以下操作:

<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>

未经测试,但您可以尝试以下方法:

<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>

您需要首先查询数据库中正在使用的字母,然后创建从a到Z的循环语句,并将
标记为
已禁用或未禁用

<?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>';

您需要首先查询数据库中正在使用的字母,然后创建一个从a到Z的循环语句,并将
标记为
已禁用或未禁用

<?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>';

从不在if语句中获取,因此没有数据库结果,只添加字母。获得相同的结果。当我在开发人员控制台中查看时,它会为每个结果显示“通知:未定义索引:页码/行号中的A”,但控件显示字母A-Z。但不确定为什么会显示该通知。我们能够使用@MartinBean answer使其工作。真的很感谢你的帮助!从不在if语句中获取,因此没有数据库结果,只添加字母。获得相同的结果。当我在开发人员控制台中查看时,它会为每个结果显示“通知:未定义索引:页码/行号中的A”,但控件显示字母A-Z。但不确定为什么会显示该通知。我们能够使用@MartinBean answer使其工作。真的很感谢你的帮助!谢谢@MartinBean能够让它工作,谢谢你的解释!谢谢@MartinBean能够让它工作,谢谢你的解释!