使用数组过滤SQL查询

时间:2013-08-14 22:28:24

标签: php mysql where

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

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

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

所以现在我有了这个PHP页面,首先获取字符串,然后使用explode函数将其拆分为基于逗号的数组,所以我有一个包含3个元素的数组,在本例中是美国,英国和AU。

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

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

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

WHERE Population>$population AND Country=

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

如果它只是一个国家,它会很简单,它将与人口相同,只有Country ='$ country',但我如何做到这一点,以便它选择所有对应任何一个的城市用户选择的值,存储在数组中。

由于

2 个答案:

答案 0 :(得分: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;"的国家/地区列表。相信我,有些坏人只是想要对你做这件事。

您可以使用MySQL FIND_IN_SET功能,但这会击败您在Country列上可能包含的任何索引。

答案 1 :(得分:0)

您可以使用OR:

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

在$ population内。根据你的php,它可能并不难。