Php 动态填充两个下拉菜单

Php 动态填充两个下拉菜单,php,javascript,mysql,dynamic,drop-down-menu,Php,Javascript,Mysql,Dynamic,Drop Down Menu,我不是(我相信你会注意到下面)程序员或程序员。我写网络文档手册 也就是说,我确实对HTML、php、css等有一些熟悉。但接下来的事情让我完全难倒了: 我正试图为一位陷入困境的朋友建立一个网站,尽管其他一切都很顺利,但我必须将最终用户重定向到专门为他们的社区建立的网页 我需要的是最终用户点击下拉菜单的一种方式,该菜单列出(通过MySQL查询)所有记录可用的状态,当他们在第一个菜单中选择一个选项时,第二个菜单由该状态中的社区(同样通过MySQL)填充 虽然我在互联网上搜寻过可能有用的东西,但我发现

我不是(我相信你会注意到下面)程序员或程序员。我写网络文档手册

也就是说,我确实对HTML、php、css等有一些熟悉。但接下来的事情让我完全难倒了:

我正试图为一位陷入困境的朋友建立一个网站,尽管其他一切都很顺利,但我必须将最终用户重定向到专门为他们的社区建立的网页

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

虽然我在互联网上搜寻过可能有用的东西,但我发现我根本不具备编码逻辑。然而,我确实发现有一个网站显示了我正在尝试做的事情的基本版本(),但我似乎无法让它与MySQL一起工作。这就是我目前所处的位置:

剧本--


函数交换选项(ArrayName){
var ExSelect=document.theForm.sites;
var theArray=eval(ArrayName);
setOptionText(ExSelect,阵列);
}
功能设置OptionText(选择,阵列){
for(循环=0;循环
和HTML--


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

最后,下拉列表1应该填充所有可用状态。一旦用户选择了他们的状态,这将触发下拉列表2的填充,所有社区都在他们选择的状态内。在下拉列表2中单击社区选择后,它应将用户的浏览器重定向到,例如


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

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

我可能认为第二种方法对你来说是更好的选择,因为它更直截了当。所以我将重点讨论这一点,但如果您想要一个可以讨论的AJAX解决方案的话

我将修改您的脚本,以进行一次DB调用。因为您是从一个表中查询信息,所以没有理由调用数据库两次

只需使用
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']);
    }
}
这将首先隐藏“站点”菜单和其中的所有选项

现在我将展示一些简单的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
    });
});

当2次就足够时,为什么要使用11次回声?您可以使用。看起来您必须在选择下拉列表1上的选项时进行ajax调用,或者单独预加载所有州的所有可能社区列表,并在选择第一个下拉列表上的选项时显示/隐藏它们。或者,每次选择一个选项时都重新加载整个页面,但您可能不想这样做:)嗨,Jocelyn,非常感谢您的评论。至于重复使用echo,你是绝对正确的。我只有这样在这里,因为这是一项正在进行的工作,一旦完成,我一定会清理和收紧它。再次感谢:)嗨,马恩,嗯。。。AJAX我正在调查,但我想这有点过头了。不过,我认为你可能是对的,这是最好的选择。我只是不确定我能不能做到。非常感谢,我一定会更多地关注Ajax!将所有的
echo
s替换为
echo“$stateChoice
。迈克,多亏了你,我的工作才得以顺利进行。不管出于什么原因,sprintf()都不会打印任何内容;不过不用担心,因为我只是把它们换成printf(),所有的东西都是肉汁。然而,我似乎无法克服的问题是,第二个下拉选择框仅给出列表中的一个社区(始终是最后一个),而不是所选状态的整个列表。有什么想法吗?@user1661045很乐意帮忙。我只是忘记在
sprintf
函数调用之前放置
echo
。我已经更改了答案以备将来使用。你应该接受这个答案,以帮助建立你的声誉,让其他人更有可能在未来的问题上帮助你。迈克,你知道为什么我可能只从第二个下拉列表中删除其中一个社区吗?顺便说一句,
echo sprintf();再次感谢@用户1661045我不确定我是否知道你的意思。你是说“站点”下拉列表中只有一个项目,还是说使用javascript一次只显示一个项目?站点下拉列表只显示一个选项,而不是完整列表。
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']);
    }
}
#sites { display: none; }
#sites option { display: none; }
$(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
    });
});