【问题标题】:How to get in a variable the value of the selection of a Select/Drop Down Menu PHP or HTML如何在变量中获取选择/下拉菜单 PHP 或 HTML 的选择值
【发布时间】:2016-05-12 18:34:27
【问题描述】:

我正在尝试连接 2 个下拉菜单,因此在第一个下拉列表中,我显示国家列表,并根据国家/地区的选择显示所选国家/地区的城市列表。

我的 index.php 文件可以正确加载所有国家/地区,如下图所示:

加载我的国家/地区的代码

<select name="country" id="country">
    <?php
    $db = pg_connect("$db_host $db_name $db_username $db_password");
    $query = "SELECT country FROM countries";

    $result = pg_query($query);
    if (!$result) {
        echo "Problem with query " . $query . "<br/>";
        echo pg_last_error();
        exit();
    }

    printf ("<option value=Select>Select a Country</option>");
    while($myrow = pg_fetch_assoc($result)) {
    printf ("<option value=$myrow[country]>$myrow[country]</option>");
 }
    ?>
</select>

现在我正在尝试根据前一个“选择”中的选择做同样的事情,但它不起作用。我遇到的问题是在国家选择中选择值,因为如果我硬输入一个国家的值,例如: $query = "SELECT city FROM cities where country = Albania";然后它工作。我还尝试打印所选国家/地区的值: (echo $selectedCountry;) 它没有打印任何内容,所以我猜 $selectedCountry = $_GET['country'];或 $selectedCountry = $_POST['country'];正在获取所选国家/地区的值。

<select name="city" id="city">
    <?php
    $db = pg_connect("$db_host $db_name $db_username $db_password");

$selectedCountry = $_GET['country'];
    $selectedCountry = $_POST['country'];
    echo $selectedCountry;

    $query = "SELECT city FROM cities where country = ' $selectedCountry '";

    $result = pg_query($query);
    if (!$result) {
        echo "Problem with query " . $query . "<br/>";
        echo pg_last_error();
        exit();
    }
    printf ("<option value=Select>Select a City</option>");
    while($myrow = pg_fetch_assoc($result)) {
    printf ("<option value=$myrow[city]>$myrow[city]</option>");
}
    ?>
</select>

非常感谢您

更新

这是我在第一次加载中看到的。根据上图,国家选择加载了所有值,而城市选择为空(仅“选择城市”值)等待加载取决于国家选择的值。

最新更新 - 来自 Borna 的建议

博尔纳,

我已经尝试了您的建议,低于我正在使用的确切代码。以两个国家为例。但是,城市在第一次加载时是空的,当我选择一个国家时,城市选择中没有任何加载,我得到以下屏幕。它似乎实际上没有调用/运行 getCities.php:

索引.html

<!DOCTYPE html>
<html>
<head>

<script>
    function populateCities(citiesSelectBoxOptions){
        document.getElementById("city").innerHTML = citiesSelectBoxOptions;
    }

    function httpGetAsync(theUrl, callback)
    {
        alert(theUrl);
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
                callback(xmlHttp.responseText);
        }
        xmlHttp.open("GET", theUrl, true); // true for asynchronous
        xmlHttp.send(null);
    }
</script>
</head>
<body>

<select name="country" id="country" onchange="httpGetAsync('http://localhost/FillCity/getCities?country=' + this.value, populateCities)">
<option value="Angola">Angola</option>
<option value="Spain">Spain</option>
</select>

<select name="city" id="city">

</select>

</body>
</html>

getCities.php

<?php

include("config.php");

$db = pg_connect("$db_host $db_name $db_username $db_password");
$selectedCountry = $_GET['country'];
echo "country: " .$country;

$query = "SELECT city FROM cities where country = ' $selectedCountry '";

$result = pg_query($query);
if (!$result) {
echo "Problem with query " . $query . "<br/>";
echo pg_last_error();
exit();
}
printf ("<option value='Select'>Select a City</option>");
while($myrow = pg_fetch_assoc($result)) {
printf ("<option value='$myrow[city]'>$myrow[city]</option>");
}
?>

更新

如果我运行 http://localhost/FillCity/getCities?country=Spain 这就是我得到的

如果我只运行http://localhost/FillCity/getCities.php,我会得到:(我得到了 country 这个词,因为我在代码中放置并回显 $country 以查看所选国家/地区)

这是我的本地主机下的 FillCity 文件夹 (var/www/html)

这是我第一次以安哥拉作为默认国家/地区运行 Index.html 时看到的内容。

如果我选择任何国家,例如西班牙,这就是我得到的

最后更新

当我打开 .html 文件并选择一个国家/地区时,这就是我得到的(仍在屏幕上打印该消息):

单击“确定”后,它就可以工作了,我可以看到该国家/地区的所有城市(但我当然不希望弹出该消息)

再次感谢

【问题讨论】:

  • 第一次加载 index.php 时,两个下拉菜单都已经加载了吗?我的意思是,您说它可以很好地填充国家/地区列表,但它是否也在同时构建城市列表,并显示所有城市,无论国家/地区,还是什么?
  • @P.Gearman 这并没有改变,因为他正在使用 $_GET['country'] 的值。我的建议是您尝试使用原生选择框,看看它是否有效。
  • @Borna 什么是原生选择框?谢谢
  • 好吧,我试图了解第二个下拉列表是通过 AJAX 调用加载还是一直存在。
  • @P.Gearman 首先加载所有国家/地区均按照所附图像加载。但是,城市未加载。城市选择器只有:“选择城市”值。谢谢

标签: php postgresql drop-down-menu


【解决方案1】:

好吧,您真正需要的是 AJAX 调用,它允许您在不重新加载页面的情况下与服务器通信。您所要做的基本上就是发送一个带有国家参数的新 HTTP 请求,以获取其中的城市列表。正确的方法是仅以 JSON 或类似格式发送(HTTP 响应)数据(城市),而不是其呈现(html),但为简单起见,您可以像开始一样继续工作(使用 html 返回数据) .

首先在另一个脚本中分离生成 HTML selectBoxOptions 城市的代码。 您将使用该脚本通过 AJAX(XMLHttpRequest 库)获取特定国家/地区的城市列表。

看看这个,它是您问题的有效解决方案。每当用户更改 countrySelectBox 选项时都会发送 HTTP 请求,这样您的城市选择框就会在每次需要时更新。 您所要做的就是更改 onchange 属性中指向您的脚本的 url(我之前说过您应该将第二个代码块移动到单独的脚本中)。

<!DOCTYPE html>
<html>
<head>

    <script>
        function populateCities(citiesSelectBoxOptions){
            document.getElementById("city").innerHTML = citiesSelectBoxOptions;
        }

        function httpGetAsync(theUrl, callback)
        {
            alert(theUrl);
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
                    callback(xmlHttp.responseText);
            }
            xmlHttp.open("GET", theUrl, true); // true for asynchronous
            xmlHttp.send(null);
        }
    </script>
</head>
<body>


<select name="country" id="country" onchange="httpGetAsync('www.yourdomain.com/getCities.php?country=' + this.options[this.selectedIndex].value, populateCities)">
    <option value="Country1">Country 1</option>
    <option value="Country2">Country 2</option>
</select>

<select name="city" id="city">

</select>

</body>
</html>

getCities.php

<?php

$db = pg_connect("$db_host $db_name $db_username $db_password");

$selectedCountry = $_GET['country'];

$query = "SELECT city FROM cities where country = ' $selectedCountry '";

$result = pg_query($query);
if (!$result) {
    echo "Problem with query " . $query . "<br/>";
    echo pg_last_error();
    exit();
}
printf ("<option value='Select'>Select a City</option>");
while($myrow = pg_fetch_assoc($result)) {
    printf ("<option value='$myrow[city]'>$myrow[city]</option>");
}
?>

编辑:

httpGetAsync 是原生的(仅使用纯/vanilla javascript。不使用其他库)javascript 函数,使您无需重新加载页面即可发送 HTTP 请求。我看到你在使用 jQuery,它隐藏了这个函数的复杂性,与 form->submit 相同,但我建议你学习 httpGetAsync 是如何工作的,因为使用 jQuery 来完成这样一个简单的任务是大材小用。

你不需要这个 javascript 函数

function getCity(countryId) 

相反,您应该将与数据库通信的代码放在 .php 文件中,而不是 javascript 中(请记住,javascript 是客户端,它在客户端机器上执行,例如浏览器,而 php 在服务器上执行)。你的 SQL 永远不应该用 javascript 编写。客户端代码不能直接与数据库通信,只能通过服务器端编码。为此,您必须将 PHP 脚本 getCities.php 的值作为 HTTP 响应返回给客户端(javascript)。

当您向某个 .php 文件发送 HTTP 请求时,该脚本会在服务器上执行,并且您在脚本末尾所说的“echo”或“print”的所有内容都会自动作为 HTTP 响应发送。您实际上不必编写任何代码来发送 HTTP 响应。它自动完成。您只需要在客户端回显/打印您需要的任何内容。在您的情况下,您需要打印特定国家/地区的选项。

脚本如何知道它需要从数据库中选择哪个国家的城市? 好吧,您发送带有参数“国家”的 HTTP 请求。这就是您提交表单时自动执行的操作。 Form 中的所有 HTML 标记,并具有 name 属性集,都将作为参数在 HTTP 请求中发送。但是,由于您不能使用提交,您必须手动执行此操作。

在 HTTP GET 请求中发送参数非常简单。 看看下面的网址:

localhost/getCities?country=countryX&someOtherParam=something&myThirdParam=something3

在服务器端,将填充以下变量:

$_GET["country"] // value is 'countryX'
$_GET["someOtherParam"] // value is 'something'
$_GET["myThirdParam"] // value is 'something3'

要详细了解 GET 和 POST 的工作原理以及区别,请查看this

首先创建一个 getCities.php 文件,然后复制粘贴与数据库通信并生成城市选项的代码。这基本上是你已经做过的,你只需将该代码放在单独的 .php 文件中。因此,当客户端(浏览器)请求特定国家/地区的城市列表时,您将发送 HTTP 请求(使用 httpGetAsync() 函数)从服务器获取该列表。

在你的 index.php 中复制粘贴这个脚本

<script>
    function populateCities(citiesSelectBoxOptions){
        document.getElementById("city").innerHTML = citiesSelectBoxOptions;
    }

    function httpGetAsync(theUrl, callback)
    {
        alert(theUrl);
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
                callback(xmlHttp.responseText);
        }
        xmlHttp.open("GET", theUrl, true); // true for asynchronous
        xmlHttp.send(null);
    }
</script>

接下来,在选择框上加上onchange属性,记住,都是小写,不是onChange。

<select name="country" id="country" onchange="httpGetAsync('localhost/getCities?country=' + this.value, populateCities)">

任何问题都可以问... :)

【讨论】:

  • 非常感谢您的帮助。我尝试了您的代码,但无法使其正常工作。我想是因为我的编程知识有点有限,无法遵循所有说明,例如我不知道 httpGetAsync 做了什么。但是,我用一个不同的选项重新开始,我非常接近我的结果并且我将其发布为更新。再次感谢
  • 我不好意思问,但我正在使用提供的代码,但仍然无法正常工作。请查看我在原始帖子中发布的最新更新,其中包含我遇到的问题的打印照片。我还在使用它时发布了所有代码。再次感谢你。非常感谢您的帮助
  • @SamueldelRio 为什么在 getCities.php 中有 HTML?它应该在你的 index.html
  • 粘贴代码时我不知道自己在做什么,但我的 php 文件中没有 HTML 代码,但在 index.html 中。我已经修复了原始帖子以反映我的代码。问题还是一样的。再次感谢
  • 你试过直接在浏览器中运行url吗? localhost/FillCity/getCities?country=Spain。通过浏览器转到该位置并检查它是否输出 html 选项。
【解决方案2】:

嗯,我想一种方法是使用 jQuery。

可能有几种不同的方法可以做到这一点,但您可以做的是,将所有城市加载到城市下拉列表中,无论国家/地区如何,但将 printf 更改为像这样的城市选项。

$query = "SELECT city, country FROM cities";
....
while($myrow = pg_fetch_assoc($result)) {
    printf ("<option class="$myrow[country] city_select" value=$myrow[city]>$myrow[city]</option>");
}

然后在页面的 javascript 中,有类似的东西

$('#country').bind('change', function(){
    var country = $(this).val();
    $('#city option.city_select').hide();
    $('#city option.'+country+'').show();
});

不过,这不一定是最优雅的解决方案。

【讨论】:

    【解决方案3】:

    您的选项中缺少引号,应该类似于

    <option value=$myrow['city']>$myrow['city']</option>
    

    试试看

    【讨论】:

    • 谢谢,但不需要引号。实际上,对于国家而言,没有引号。谢谢
    • 是的,我只是觉得哈哈抱歉
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2013-03-11
    相关资源
    最近更新 更多