1

我正在尝试模仿 Windows“映射网络驱动器”下拉菜单的工作方式。我的下拉选项是字母 AZ。根据我的 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”将显示但禁用,而字母表中的所有其他字母都是可选的。

这是我目前拥有的代码。它非常接近正确,但不知何故失序。它确实显示了字母表中的每个字母和我的数据库结果(禁用了这些结果),但是每个数据库结果都显示了字母表中的每个字母。再次使用上面的示例数据库,下面的代码将为每个结果显示字母“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',但似乎没有让它们按正确的顺序排列。

4

2 回答 2

2

您需要首先在数据库中查询正在使用的字母,然后创建一个从 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>';
于 2013-07-03T15:07:21.400 回答
2

未经测试,但你可以试试这个:

<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>
于 2013-07-03T15:03:09.333 回答