我目前正在处理一个页面,我需要根据用户选择的数据向MySQL数据库发送查询。
好的,更具体一点。我有一个网页,用户可以在其中选择国家/地区。使用javascript我将选择的国家/地区作为字符串。这些国家/地区缩写为2个字母的代码,因此我得到一个字母“US,GB,AU”,表示用户选择了美国,英国和澳大利亚。
现在,我将它发送到一个PHP页面,它使用GET参数获取它。
所以现在我有了这个PHP页面,首先获取字符串,然后使用explode函数将其拆分为基于逗号的数组,所以我有一个包含3个元素的数组,在本例中是美国,英国和AU。
现在那部分我不知道该怎么办。除了国家,用户还可以选择人口。然而,这很简单,因为它总是只有一个数字。
我要做的是我想向MySQL数据库发送查询,该数据库包含许多城市,并根据用户选择的人口和国家选择一些。
所以我有SQL查询,然后关键位是WHERE语句,我有:
WHERE Population>$population AND Country=
现在这是我不知道如何继续的地方。我想要的是从所选国家获得所有城市。每个城市都是数据库中的一行,其中包含其名称,人口和国家/地区代码。
如果它只是一个国家,它会很简单,它将与人口相同,只有Country ='$ country',但我如何做到这一点,以便它选择所有对应任何一个的城市用户选择的值,存储在数组中。
由于
答案 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,它可能并不难。