-1

$_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变量:

    if((isset($_GET['var_src'])) && in_array($_GET['var_src'], $var_array)) {
        $var_sort = $_GET['var_src'];
    }

同样,$var_array是从 db 表复制的数组。

这是代码停止的地方,因为$_GET在数组中找不到 var。

如果我将其中一个数据库记录更改为一个类别值(例如“三明治”)并在列表中选择该选项,则结果与预期一致。但是,如果记录具有多个类别值(每个都在白名单数组中),例如“Pizza,Sandwiches”,那么它们都不起作用。

更重要的是,如果我在 db 记录中包含类别值“Italian”,无论是单独还是与其他值一起,并选择该值,那么它就可以工作。我不知道为什么。

因此,如果选择了该特定值('Italian'),则无论是否将其他值作为记录的逗号分隔字符串包含在内,该代码都可以工作,并且不适用于与记录关联的值超过一个的其他值。

我确认有问题的值在 URL 中,因此应该使用上面的代码 (in_array($_GET['var_src'], $var_array))。

另外,我不知道为什么更改数据库记录会产生影响,因为对白名单的清理发生在根据传递的值选择记录之前。据我所知,in_array只是没有在数组中找到合法值。

希望我没有让这令人困惑。谢谢你的帮助。

4

1 回答 1

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';
于 2012-08-12T21:32:33.623 回答