【问题标题】:How do I show each item in a multi-select dropdown as already selected if it is in the database?如果它在数据库中,如何将多选下拉列表中的每个项目显示为已选择?
【发布时间】:2013-06-25 18:11:32
【问题描述】:

所以我有一个表格可以编辑我的数据库中已有的单位。有一个多选下拉菜单,我可以在其中选择单位的供应商。我需要已经分配给单元的供应商在下拉列表中显示为选中(突出显示),因此用户只需 ctrl+单击他们想要添加到单元的新供应商。

units_suppliers 是我设置的连接表,其中包含成对的 Unit 和 Supplier 用于确定将哪个供应商分配给哪个单元的 ID,反之亦然。

这是我目前拥有的代码,但它不起作用。我根据不同的 SQL 查询创建了两个不同的数组,并尝试比较它们是否具有相同的供应商名称,如果是,则将“选定”属性添加到标记中。但这似乎不起作用。谁能帮帮我?

编辑:这两个查询似乎都产生了正确的结果,所以我认为问题出在我的嵌套循环中,但我不知道出了什么问题。感谢您的建议。

<td><select size=7 multiple="multiple" name="unitsuppliers[]">
<?php
$sql = "SELECT suppliers_id, supplier_name FROM suppliers GROUP BY supplier_name ORDER BY supplier_name";
$result = mysql_query($sql,$connection);

/* THIS PART FINDS OUT IF THE SUPPLIER SHOULD ALREADY BE HIGHLIGHTED IN THE LIST */
$sql2 = "SELECT suppliers.supplier_name 
            FROM suppliers, units_suppliers 
            WHERE units_suppliers.unit_user_id = ";
if(isset($old_details['unit_user_id'])){
    $sql2 .= " {$old_details['unit_user_id']} ";
} elseif(isset($_POST['old_unit_id'])){
    $sql2 .= " {$_POST['old_unit_id']} ";
} else {
    $sql2 .= " 0 ";
}
$sql2 .=    " AND suppliers.suppliers_id = units_suppliers.suppliers_id";

$result2 = mysql_query($sql2,$connection);

while ($row = mysql_fetch_array($result)) {
            echo "<option value=\"{$row['suppliers_id']}\" ";

            while ($in_junc_table = mysql_fetch_array($result2)) {
                foreach ($in_junc_table as $array){
                    if($array['supplier_name'] == $row['supplier_name']){
                        echo " selected ";
                    }
                }
            }
            echo " >"; 
            echo "{$row['supplier_name']}";                         
        }   
?>

【问题讨论】:

  • 您需要清理您的数据,请:stackoverflow.com/questions/601300/what-is-sql-injection
  • 您不能只指定selected。在大多数浏览器中,您仍然需要指定一些真实值:selected="selected"
  • 你不能加入这两个表吗?对于您使用 WHERE 子句设置的条件,这应该只留下两个表中的供应商。
  • @RobW,任何可输入的字段都有一个 mysql_prep() 函数应用于它以停止 SQL 注入。无论如何,谢谢您的提示。
  • @Kyle 我试过 selected='selected' 还是不行。还有其他想法吗?

标签: php html mysql drop-down-menu multi-select


【解决方案1】:

请记住,mysql_* 函数家族现已弃用,请尝试使用 PDO。

看来您可以使用JOIN 语句并运行单个查询,请尝试以下代码:

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>','<USERNAME>','PASSWORD');
$statement = $db->prepare("SELECT s.suppliers_id AS id, s.supplier_name AS name, u.unit_user_id AS user_id FROM suppliers s LEFT JOIN units_suppliers u USING suppliers_id WHERE (u.unit_user_id = :user_id OR u.unit_user_id IS NULL) GROUP BY s.supplier_name ORDER BY s.supplier_name");

if (isset($old_details['unit_user_id'])) {
    $user_id = $old_details['unit_user_id'];
}
else if (isset($_POST['old_unit_id'])) {
    $user_id = $_POST['unit_user_id'];
}
else {
    $user_id = 0;
}

$statement->execute(array(
    ':user_id' => $user_id
));

$supliers = $statement->fetchAll(PDO::FETCH_ASSOC);

foreach ($suppliers as $supplier) { ?>
    <option value="<?php echo intval($supplier['id']) ?>" <?php  echo ($supplier['user_id'] == $user_id ? 'selected="selected"' : '') ?>><?php echo htmlspecialchars($supplier['name']) ?></option>
<?php }

没有 PDO:

/**
 * Escape values that will be part of the query
 */
if (isset($old_details['unit_user_id'])) {
    $user_id = intval($old_details['unit_user_id']);
}
else if (isset($_POST['old_unit_id'])) {
    $user_id = intval($_POST['unit_user_id']);
}
else {
    $user_id = 0;
}

$suppliers = array();

$query = "SELECT s.suppliers_id AS id, s.supplier_name AS name, u.unit_user_id AS user_id FROM suppliers s LEFT JOIN units_suppliers u USING suppliers_id WHERE (u.unit_user_id = $user_id OR u.unit_user_id IS NULL) GROUP BY s.supplier_name ORDER BY s.supplier_name";
$result = mysql_query($query,$connection);

if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
        $suppliers []= $row;
    }

    mysql_free_result($result);
}

foreach ($suppliers as $supplier) { ?>
    <option value="<?php echo intval($supplier['id']) ?>" <?php  echo ($supplier['user_id'] == $user_id ? 'selected="selected"' : '') ?>><?php echo htmlspecialchars($supplier['name']) ?></option>
<?php }

【讨论】:

  • 我知道 mysql_* 函数不再真正使用,但我对 PHP 很陌生,这是我学习的方式。重新做整个网站为时已晚,但我计划在完成后以这种方式学习。如果您能告诉我$statement-&gt;execute(array( ':user_id' =&gt; $user_id )); $supliers = $statement-&gt;fetchAll(PDO::FETCH_ASSOC); 的旧版本是什么,我将不胜感激。
  • 我成功了! MySQL 查询中出现错误,其中“USING”应该是“ON”。这是我使用的查询SELECT s.supplier_name, s.suppliers_id, u.unit_user_id FROM suppliers s LEFT JOIN units_suppliers u ON s.suppliers_id = u.suppliers_id WHERE (u.unit_user_id = $unit_id OR u.unit_user_id IS NULL) GROUP BY s.supplier_name ORDER BY s.supplier_name,但非常感谢!
  • 嗯,我现在似乎遇到了一个问题,但如果我选择不同的单位来选择它的供应商,则为前一个单位选择的供应商不可见。有什么想法吗?
  • 我不太明白这个问题
猜你喜欢
  • 2020-05-24
  • 2022-01-23
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多