【问题标题】:Dynamically populate two dropdown menus动态填充两个下拉菜单
【发布时间】:2012-09-03 17:32:59
【问题描述】:

我不是(我确信您会在下面注意到)程序员或编码员。我编写网络文档手册。

也就是说,我确实对 HTML、php、css 等有一定的了解。但是接下来发生的事情让我彻底崩溃了:

我正在尝试为我的一个处于绑定状态的朋友构建一个站点,尽管其他一切都很好,但我确实必须将最终用户重定向到专门为他们的社区构建的网页。

我需要的是一种让最终用户单击下拉菜单的方法,该下拉菜单列出(通过 MySQL 查询)记录可用的所有状态,当他们在第一个菜单中选择一个选项时,第二个菜单由该州内的社区(同样通过 MySQL)填充。

虽然我已经在互联网上搜索了可能有用的东西,但我发现我根本不具备编码逻辑的能力。但是,我确实找到了一个站点,该站点显示了我正在尝试做的事情的基本版本 (see here),但我似乎无法让它与 MySQL 一起使用。这是我到目前为止的位置:

脚本--

<script>
 function swapOptions(ArrayName) {
       var ExSelect = document.theForm.sites;
       var theArray = eval(ArrayName);
       setOptionText(ExSelect, theArray);
    }

 function setOptionText(theSelect, theArray) {
       for (loop = 0; loop < theSelect.options.length; loop++) {
           theSelect.options[loop].text = theArray[loop];
       }
    }
 </script>

和 HTML --

 <form name="theForm">
   <select name="chooseCat" onchange="swapOptions(this.options[selectedIndex].text);">
        <option value="">Please select your state ...</option>'
                 <?php 
                    $query = mysql_query("SELECT DISTINCT state FROM sites ORDER BY state") 
                           or die(mysql_error());  
                    while ($result = mysql_fetch_assoc($query)) {   
                           $stateChoice = $result['state'];                                      
                             echo '<option value="';
                             echo "$stateChoice"; 
                             echo '">';
                             echo "$stateChoice";  
                             echo '</option>';
                             echo '<br />';                  
                     }
                  ?>
    </select> 
    <select name="sites" style="min-width: 100px;" onchange="location.href='reports.php?page=' + this.options[this.selectedIndex].value;">
                  <?php 
                     $query = mysql_query("SELECT * FROM sites") 
                            or die(mysql_error());  
                     while ($result = mysql_fetch_assoc($query)) {                                      
                            echo '<option value="';
                            echo '">';
                            echo $result['longname'];  
                            echo '</option>';
                            echo '<br />';                  
                      }
                   ?>
     </select>
 </form>

这会返回两个下拉菜单。第一个是我对可用状态的查询结果,在下拉列表中按字母顺序列出。第二个是列出的所有站点的长名称,但针对表中的所有站点,而不仅仅是某个州(刚刚选择的州)内的站点。

最后,下拉菜单 1 应填充所有可用状态。一旦用户选择了他们的状态,这应该会触发下拉列表 2 的人口以及他们选择的状态内的所有社区。在下拉列表 2 中单击社区选择后,它应该将用户的浏览器重定向到,例如,http://www.webpage.com/reports.php?page=communityNameGoesHere ...

非常感谢您在这里的任何建议:)

【问题讨论】:

  • 既然2次就够了,为什么还要使用11次echo?你可以使用concatenation
  • 看起来您必须在选择下拉 1 上的选项时进行 ajax 调用,或者单独预加载所有状态的所有可能的社区列表,并在选项时显示/隐藏它们在第一个下拉列表中被选中。或者,好吧,每次选择一个选项时重新加载整个页面,但您可能不想这样做:)
  • 嗨乔斯林,非常感谢您的评论。至于重复使用echo,你是绝对正确的。我这里只有这样,因为它正在进行中,一旦完成,我一定会清理并收紧它。再次感谢:)
  • 嗨,马恩,嗯……阿贾克斯?!我正在研究它,但我认为这有点过头了。我认为你可能是对的,它是最好的选择。我只是不确定我能不能做到。非常感谢,我一定会更多地研究 Ajax!
  • 将所有echos 替换为echo "&lt;option value=\"$stateChoice\"&gt;$stateChoice&lt;/option&gt;&lt;br /&gt;";

标签: php javascript mysql dynamic drop-down-menu


【解决方案1】:

您有几条路线可以走。您可以使用 AJAX 在选择状态时获取站点列表的值。或者,您可以简单地使用 javascript 根据状态的选择过滤第二个列表中的值。

我可能认为第二个对你来说会是一个更好的选择,因为它更直接。因此,我将重点介绍这一点,但如果您想要一个也可以讨论的 AJAX 解决方案。

我会修改您的脚本以进行单个数据库调用。由于您是从一张表中查询信息,因此没有理由两次调用数据库。

只需使用SELECT * FROM sites ORDER BY states ASC

然后您可以遍历结果集并执行类似的操作

$array = array();
while ($row = mysql_fetch_assoc($query)) {
    $array[$row['state']][] = $row;
}

然后构建您的第一个选择并使用以下内容填充选项:

foreach($array as $state => $not_used) {
    echo sprintf('<option value="%1$s">%1$s</option><br />', $state);
}

现在构建第二个选择并使用以下内容填充选项:

foreach($array as $state => $state_array) {
    foreach($state_array as $site) {
        echo sprintf('<option class="%1$s" value="%2$s">%3$s</option><br />', $state, $site['shortname'], $site['longname']);
    }
}

注意,我在这里添加了一个 HTML class 属性。这样可以方便地仅显示您想要显示的项目。

您将站点选择元素的 ID 设置为 sites,并将状态选择元素的 ID 设置为 states。在您的 CSS 中设置以下规则:

#sites { display: none; }
#sites option { display: none; }

这最初将隐藏站点菜单及其中的所有选项。

我现在将展示一些简单的 jQuery,用于隐藏/显示正确的元素,以及在站点选择时进行重定向。我提到了 jQuery,因为这让你想要做的事情变得轻而易举。

$(document).ready(function () { // calls this function on document ready
    $('#states').change(function() { // binds onchange function to #states select
        var selected_state = $(this).val(); // gets current selected value of #states select
        $('#sites option').hide(); // hides all options in sites select
        $('.'+selected_state).show(); // show site options with class = selected_state
        $('#sites').show(); // show entire #sites select (only useful for display from initial hidden state)
    });
    $('#sites').change(function() { // binds onchange function to #sites select
        window.location = 'reports.php?page=' + $(this).val(); // perform redirect
    });
});

【讨论】:

  • 所以,多亏了迈克,我才能完成这项工作。不管出于什么原因, sprintf() 都不会打印任何东西。不过不用担心,因为我只是将它们换成了 printf() 并且一切都是肉汁。然而,我似乎无法解决的问题是,第二个下拉选择框只给了我列表中的一个社区(总是最后一个),而不是所选状态的整个列表。有什么想法吗?
  • @user1661045 很高兴为您提供帮助。我只是忘了把echo 放在sprintf 函数调用之前。我已更改答案以备将来使用。您应该接受此答案,以帮助建立您的声誉并让其他人更有可能帮助您解决未来的问题。
  • 迈克,你知道为什么我可能只会将其中一个社区从第二个下拉列表中删除吗?顺便说一句,echo sprintf() 效果很好;再次感谢!
  • @user1661045 我不确定我明白你的意思。您是说“站点”下拉列表中只有一项,还是使用 javascript 一次只显示一项?
  • 网站下拉菜单只显示一个选项,而不是完整列表。
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 2023-04-05
  • 1970-01-01
  • 2020-12-19
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多