當我試圖檢查$_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
只是沒有在數組中找到合法的值。
希望我還沒有使這個混淆。謝謝你的幫助。
問題是這麼久,我沒有慣於閱讀 - 哈哈。有一件事我注意到,但是,你的網址../search.php?var_src=Sandwiches?city_src=Cityname的格式無效。 2個問號,第二個應該是& – 2012-08-12 20:00:49
我可以向你指出'in_array'的工作原理 - 這是你所做的事情,這是造成這個問題的原因。嘗試'var_export'來自'$ _GET'的輸入並查看它。 – troelskn 2012-08-12 20:12:14
謝謝,我編輯了URL。此外,剛剛嘗試過'var_export',它會按照預期輸出'$ _GET' var,但'$ var_sort'仍然沒有被設置 - var_export輸出'false'(變量最初被設置爲false)。我知道'in_array'的工作方式與設置'$ var_sort'的代碼一樣,因爲我對其他兩個選項使用相同的代碼。無法弄清楚這裏發生了什麼。 – tjkampa 2012-08-12 20:23:30