Javascript 根据从另一个列表中选择的内容填充下拉列表

Javascript 根据从另一个列表中选择的内容填充下拉列表,javascript,php,Javascript,Php,我试图填充一个下拉列表,其中包含基于用户选择的国家的城市名称。 这是该国的下拉列表: <select name = "country" onChange = "loadcities(this.value)"> <?php include 'dbconnect.php'; $query = "SELECT * FROM Country"; $result = $mysqli->query

我试图填充一个下拉列表,其中包含基于用户选择的国家的城市名称。 这是该国的下拉列表:

<select name = "country" onChange = "loadcities(this.value)">
        <?php
            include 'dbconnect.php';
            $query = "SELECT * FROM Country";
            $result = $mysqli->query($query);
            while($row = $result->fetch_array()){
                echo "<option value = '$row[0]'> $row[2] </option>";
            }
        ?>
    </select>


首先,在第三个代码段中,您有$cityname和$citynames。我认为它们应该是一样的。另外,您正在从数据库中提取一列,然后使用第三列($row[2)。这可能应该是$row[0]

最后你是在回显一个数组。。。这将只输出
数组
,而不是数组的内容。同样在第二部分中,在javascript代码中,您使用了slice(),它用于将一组值从数组中获取到一个新数组中

我认为您应该将第三个代码片段更改为:

<?php
$q = $_REQUEST["q"];
include "dbconnect.php";
$result = $mysqli->query("SELECT cityname from CITY WHERE City.countryid = $q");
while($row = $result->fetch_array())
{
    echo $row[0].'@@@@';
}
?>


另一方面,您的PHP脚本有一个巨大的安全漏洞:您将$\u请求输入直接传递到数据库。在执行此操作之前,您应该对其进行清理,否则您将面临被黑客攻击的风险。

(1)如果您的
$q
是字符串,则需要引用查询中的字符串-
。。。其中City.countryid='$q'
。(2) 您应该清理您的数据,因为您正在使用
mysqli
使用准备好的statement@Sean即使用户只是从下拉列表中选择,而没有手动输入任何内容,我也需要进行清理。在php中,您不能只回显数组
echo“$citynames”。你可以试试回声内爆($citynames)
。另外,在
var citynames=(xmlhttp.response.slice())中使用
slice()
可能应该是
split()
,由于php
infrade()
返回一个逗号分隔的字符串,您可以执行
var citynames=(xmlhttp.response).split(',')是,始终进行消毒。现在,您可以通过转到
loadcities.php?q=injected\u code
Im获取一行并使用该行中的第三列来直接注入。这就是我写$row[2]的原因。我知道安全问题,但这是一个很小的大学项目,期限很短,老师告诉我们现在不要考虑安全问题。不,你不会吵架的。您可以从行中选择一列。要获取行,您需要
从中选择*from您是否尝试了更改?它们对你有用吗?我完全重写了代码并修复了所有错误。
<?php
$q = $_REQUEST["q"];
include "dbconnect.php";
$citynames = []; 
$result = $mysqli->query("SELECT cityname from CITY WHERE City.countryid = '$q'");
while($row = $result->fetch_array()){
    $cityname[] = $row[2];
}
echo "$citynames";
?>
<?php
$q = $_REQUEST["q"];
include "dbconnect.php";
$result = $mysqli->query("SELECT cityname from CITY WHERE City.countryid = $q");
while($row = $result->fetch_array())
{
    echo $row[0].'@@@@';
}
?>
var citynames = (xmlhttp.response).slice();
var citynames = (xmlhttp.response).split('@@@@');