2012-08-12 97 views
-1

當我試圖檢查$_GET變量與白名單數組時,我收到了奇怪的結果。該變量在數組中,但in_array未找到它。我會盡可能地描述發生了什麼。in_array未找到數組中的值

$_GET變量是從選項/選擇選項中設置的,共3項。只有其中一個選項給我一個問題。要運行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只是沒有在數組中找到合法的值。

希望我還沒有使這個混淆。謝謝你的幫助。

+6

問題是這麼久,我沒有慣於閱讀 - 哈哈。有一件事我注意到,但是,你的網址../search.php?var_src=Sandwiches?city_src=Cityname的格式無效。 2個問號,第二個應該是& – 2012-08-12 20:00:49

+1

我可以向你指出'in_array'的工作原理 - 這是你所做的事情,這是造成這個問題的原因。嘗試'var_export'來自'$ _GET'的輸入並查看它。 – troelskn 2012-08-12 20:12:14

+0

謝謝,我編輯了URL。此外,剛剛嘗試過'var_export',它會按照預期輸出'$ _GET' var,但'$ var_sort'仍然沒有被設置 - var_export輸出'false'(變量最初被設置爲false)。我知道'in_array'的工作方式與設置'$ var_sort'的代碼一樣,因爲我對其他兩個選項使用相同的代碼。無法弄清楚這裏發生了什麼。 – tjkampa 2012-08-12 20:23:30

回答

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'; 
+0

非常好!非常感謝斯塔諾。完美的作品。仍然不知道爲什麼這個工程,我的修剪空白,因爲我沒有。 Array_flip?無論如何,再次感謝。 – tjkampa 2012-08-12 22:26:47