【问题标题】:PHP set selected value of dropdown boxPHP设置下拉框的选定值
【发布时间】:2010-08-28 22:36:01
【问题描述】:

我有一个用 PHP 构建的下拉框。代码如下:

 $region_result = mysql_query("SELECT * FROM region ORDER BY region");    

 $dropdown = "<select name='region'>";
while($row = mysql_fetch_assoc($region_result)) {
    $rid = $row["id"];
    $region = $row["region"];

    $dropdown .= "\r\n<option value='{$row['rid']}'>{$region}</option>";
}
 $dropdown .= "\r\n</select>";

我需要在处理完上述代码后设置下拉框的选定值。有什么简单的方法可以做到这一点?

有人有什么建议吗?谢谢!

编辑:

谢谢大家的回答。让我解释一下我在做什么。我正在设置一个“编辑用户”页面,您可以在其中按多个条件搜索用户,然后在“编辑模式”中列出结果 - 即 - 在文本框和下拉框中。因此,您可以编辑和更新用户。对于两个用户字段,我需要在下拉框中列出数据(以确保数据完整性和约束)。因此,我想显示这些下拉框,其中包含您可以更改的所有可能值,除了我希望下拉列表的选定值是当前与用户关联的值。

所以,我能够按照 deceze 的建议来完成这项工作 - 在我的 while 循环中,它使用数据库结果设置我的 PHP 值,我插入了一个嵌套的 while 循环,它将构造 $dropdown,并且在其中,嵌套的 if 循环。我对所有这些嵌套循环并不感到疯狂。这是它的代码段:

 if (@mysql_num_rows($result)) {
        while ($r=@mysql_fetch_assoc($result)) {    
            $fname = $r["fname"];
            $lname = $r["lname"];
            $region = $r["region"];
            $role = $r["role"];
            $extension = $r["extension"];
            $username = $r["username"];
            $building = $r["building"];
            $room = $r["room"];?>

            <?php
            $dropdown = "<select name='region'>";
            while($row = mysql_fetch_assoc($region_result)) {
                $rid = $row["id"];
                $region2 = $row["region"];

                if($region == $region2){
                    $dropdown .= "\r\n<option selected='selected' value='{$row['rid']}'>{$region}</option>";
                }else{
                    $dropdown .= "\r\n<option value='{$row['rid']}'>{$region2}</option>";
                }
            }
            $dropdown .= "\r\n</select>";
            ?>

但是,我正在考虑将其更改为文本替换(由 soulscratch 和 zombat 建议),因为我认为这会提高性能。

...但是,当多个结果集满足搜索条件时,这似乎不起作用(因为第二个和第三个等结果的下拉框是空的)。

你们觉得呢?

【问题讨论】:

标签: php html drop-down-menu


【解决方案1】:

通过构建字符串的方式,它是一个相当简单的str_replace(),这很好,因为它省去了需要正则表达式的麻烦:

$dropdown = str_replace("value='".$rid."'","value='".$rid."' selected=\"selected\"",$dropdown);

【讨论】:

  • Zombat-这不是我目前实施的(见我的编辑),但我正在考虑根据你的建议改变我的实施......
  • 在他的辩护中,这正是你所要求的......一种在循环之后做到这一点的方法。
【解决方案2】:

如果您想事后更改您组装的 HTML,您需要使用复杂的字符串替换方法或 Javascript,这两者都不是一个好的选择。

您最好的选择是重组您的程序,这样您就可以在第一次循环时设置selected 属性。

【讨论】:

  • 非常感谢,我能够重组我的代码,但我知道有几个级别的嵌套循环...(见编辑)
【解决方案3】:

您可以在 $_REQUEST['region'] 中找到它

【讨论】:

    【解决方案4】:

    我敢打赌你会再次遇到这个问题,这意味着提出一个更灵活的解决方案是值得的。为此,我们有一个想法:

    首先,使用一个数组来保存下拉列表的选项。如果您需要具有相同选项的多个选择元素,您可以免费重用数组:

    $options = array ();
    while ($row = mysql_fetch_assoc($region_result)) {
      $options[$row['id']] = $row['region'];
    }
    

    然后,您可以将其输入到生成选择控件的函数中:

    function getSelect ($name, $options, $current)
    {
      $markup = '<select name="' . htmlspecialchars($name) . '">';
      foreach ($options as $value => $label)
      {
        $selected = ($value == $current) ? ' selected="selected"' : '';
        $markup .= sprintf(
          "<option value=\"%s\"%s>%s</option>\r\n",
          htmlspecialchars($value), 
          $selected, 
          htmlspecialchars($label)
        );
      }
      $markup .= '</select>';
      return $markup;
    }
    

    (也可以添加一个或多个可选参数来设置idclass等)

    此外,您提到您考虑切换方法是因为速度,但现在不太可能是担心性能的时间和地点。现在专注于可维护的代码,以后任何必要的性能调整都会变得更容易和更有效。

    【讨论】:

    • 嘿,谢谢。如何使选项值从 1 而不是 0 开始?
    • @Jonny:我不确定你的意思。这些值来自数据库表的id 列,对吧?
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多