尝试针对白名单数组检查$_GET
变量时,我得到了奇怪的结果。变量在数组中,但in_array
找不到它。我会尽我所能地描述正在发生的事情。
$_GET
变量是通过选项/选择选项设置的,共有三个。只有一个选项给我一个问题。要运行SELECT
查询,必须至少选择两个选项。其他两个选项的任意组合都可以正常工作。
要获取选项/选择列表,我有一个SELECT
查询检索记录子集。
从该记录集中,我使用foreach
循环来获取各种值以填充选择标记。因此,选择值由db表中的值填充。白名单数组是从数据库中复制的。
我针对白名单数组检查任何$_GET
变量。有问题的选项可以是逗号分隔的字符串(例如'Italian,Pizza'或'American,Barbeque,Sandwiches')。
要获取此选项的选择值列表,我使用implode
创建每个类别的逗号分隔列表,然后使用explode
创建数组,然后使用array_unique
获取一个包含每个类别的单个实例的数组。当回显这个数组时,一切都是正确的(它正确地填充了选择选项)。
implode
输出:
Italian,Pizza,Italian,Pizza,Italian,Pizza,Italian,Italian,Sandwiches,Italian,Pizza,Italian
explode
输出:
Array
(
[0] => Italian
[1] => Pizza
[2] => Italian
[3] => Pizza
[4] => Italian
[5] => Pizza
[6] => Italian
[7] => Italian
[8] => Sandwiches
[9] => Italian
[10] => Pizza
[11] => Italian
)
array_unique
输出:
Array
(
[0] => Italian
[1] => Pizza
[8] => Sandwiches
)
因此,URL可以是:
../search.php?var_src=Sandwiches&city_src=Cityname
清理$_GET
vars:
if((isset($_GET['var_src'])) && in_array($_GET['var_src'], $var_array)) {
$var_sort = $_GET['var_src'];
}
同样,$var_array
是从db表复制的数组。
这是代码停止的地方,因为在数组中找不到$_GET
var。
如果我将其中一个db记录更改为一个类别值(例如'Sandwiches')并在列表中选择该选项,则结果与预期一致。但是,如果记录中有多个类别值(每个都在白名单数组中),如“Pizza,Sandwiches”,那么它们都不起作用。
如果我将类别值'意大利'包括在内,无论是单独使用还是与db记录中的其他值一起使用,并选择此值,那么它就可以了。我不明白为什么。
因此,如果选择了特定值(“意大利语”),代码是否有效,无论其他人是否包含在记录的逗号分隔字符串中,并且不能与其他多个值相关联的值一起使用记录。
我确认违规值在URL中,因此应该使用上面的代码(in_array($ _ GET ['var_src'],$ var_array))。
此外,我不知道为什么更改数据库记录会产生影响,因为在根据传递的值选择记录之前,会对白名单进行清理。据我所知,in_array
只是没有在数组中找到合法的值。
希望我没有让这个混乱。谢谢你的帮助。
答案 0 :(得分:1)
不确定这是否会对您有所帮助,请尝试更改此示例:
$opt = array( 'Italian,Pizza' , 'American, Barbeque, Sandwiches');
$opts = implode(',',$opt);
$opta = explode(',',$opts);
foreach ($opta as $key=>$value) {
$opta[$key]=trim($value);
}
$opta = array_flip($opta);
var_export($opta);
//now test it simply with isset:
$val = trim($_GET['var_src']);
echo isset($opta[$val])? 'yes':'no';