0

我目前正在处理一个页面,我需要根据用户选择的数据向 MySQL 数据库发送查询。

好的,更具体一点。我有一个网页,用户可以在其中选择国家。使用 javascript 我将国家/地区选为字符串。这些国家/地区由它们的 2 个字母代码缩写,因此我得到例如一个字符串“US,GB,AU”,它表示用户选择了美国、英国和澳大利亚。

现在,我将它发送到一个 PHP 页面,该页面使用 GET 参数获取它。

所以现在我有这个 PHP 页面,它首先获取字符串,然后使用explode 函数根据逗号将其拆分为一个数组,所以我有一个包含 3 个元素的数组,在本例中为 US、UK 和 AU。

而现在我不知道该怎么做的那部分。除了国家,用户还可以选择人口。然而这很简单,因为它总是只有一个数字。

然后我要做的是向 MySQL 数据库发送一个查询,该数据库包含许多城市,并根据用户选择的人口和国家/地区选择一些。

所以我有 SQL 查询,然后关键位是 WHERE 语句,我有:

WHERE Population>$population AND Country=

现在这是我不知道如何继续的地方。我想要的是从选定的国家获得所有城市。每个城市都是数据库中的一行,其中包含其名称、人口和国家代码。

如果它只是一个国家,那就很简单,它与人口相同,只是 Country='$country',但是我如何使它选择与所选用户对应的所有城市值,存储在数组中。

谢谢

4

2 回答 2

4

您想要 SQL 构造

 WHERE Population>$population AND Country IN ('US','GB','AU')

使用 PHP 中的准备好的语句很难做到这一点。因此,您需要非常小心以避免 SQL 注入危险。

编辑

如果你有一个名为 $country 的 php 字符串,看起来"US,UK,AU,DE"你可以使用 php 来像这样格式化它。

    $country = "US,UK,AU,DE";
    $list = explode(',',$country);
    $instring = "('" . implode("','", $list) . "')";

然后 $instring 看起来像这样: "('US','UK','AU','DE')"

您可以像这样使其免受 SQL 注入的影响:

        $country = 'US,UK,AU,DE';
        $list = array();
        foreach (explode(',',$country) as $item) {
            if (preg_match("/^[A-Z][A-Z]$/", $item) ) $list[] = $item;
        }
        $instring = "('" . implode("','", $list) . "')";        

这会破坏国家/地区列表,检查每个国家/地区代码是否为两个大写 ASCII 字母,然后将列表组合成适当的引号/逗号分隔和括号包裹的表达式。

它会阻止类似这样的国家/地区列表"US,;DROP TABLE whatever;"占用您的系统。相信我,那里有一些坏人只想对你做这种事情。

您可以使用 MySQLFIND_IN_SET函数,但这会破坏您在Country列上可能拥有的任何索引。

于 2013-08-14T22:31:04.073 回答
0

您可以使用或:

WHERE POPULATION>$population AND (COUNTRY="US" OR COUNTRY="AU" OR COUNTRY="UK")

您需要帮助遍历数组和构建查询吗?如果您还没有准备好声明或适当的转义,那么查看准备好的声明或正确转义也是明智的。考虑如果有人发送会发生什么

0; INSERT INTO USERS (USERNAME, PASSWORD) VALUES ("HACKER", "PWNED"); SELECT * FROM CITIES WHERE 1

$人口内。根据您的 php,它可能并不难做到。

于 2013-08-14T22:48:36.423 回答