2013-10-23 38 views
0

變量我有一個這樣的代碼:所有從URL

session_start(); 

$user = $_GET['user']; 
$mode = $_GET['mode']; 
$id1 = $_GET['id1']; 
$id2 = $_GET['id2']; 
$id3 = $_GET['id3']; 
$id4 = $_GET['id4']; 
$id5 = $_GET['id5']; 
$id6 = $_GET['id6']; 
$id7 = $_GET['id7']; 
$id8 = $_GET['id8']; 

$dep= $mode; 
switch ($dep) 
{ 
    case "3m": 
     $dep = "Text 1"; 
     break; 
    case "all": 
     $dep = "More text"; 
     break; 
    default: 
     $dep = "Text1"; 
} 

還有更多的其他案件。我想我很快會有更多的身份證件和案件。有沒有一種更簡單的方法可以將URL中的所有ID都推送到PHP代碼中進行評估?

我已經找到了代碼foreach

foreach($_GET as $key => $value) { 
     echo 'key is: <b>' . $key . '</b>, value is: <b>' .$value. '</b><br />'; 
    } 

而且它還有所有變量從URL,但如何更改代碼,纔能有這樣的:

$variable = $_GET['variable']; 

任何幫助表示讚賞:)

+0

使用表單數組進行研究。如果你用input_name []設置表單域,那麼你可以在服務器端循環它們。 – JimL

+0

您是否正在將值放入一個名稱爲值的變量中?爲什麼不只是使用數組來處理你打算做的事情? – George

+0

我一定會通過表單數組,thnks。 –

回答

1

假設我理解正確,並且希望所有GET變量都是可以使用的實際變量,那麼有一個函數extract即可。

然而,如文檔中指出:

不要使用提取物()在不可信數據,如用戶輸入(即$ _GET, $ _FILES等)。如果這樣做,例如,如果您想要運行暫時依賴register_globals的舊代碼 ,請確保使用非覆蓋標誌值(如EXTR_SKIP)中的一個 ,並且要知道 應該按照定義的相同順序在php.ini中的variables_order 中。

所以基本上你不應該這樣做,除非你有充足的理由,並且要小心如果你不要覆蓋任何現有的值。

但是,如果你選擇的是要做到這一點:

foreach($_GET as $key => $value) { 
     $$key=$value; 
} 

然後提取當然更好,作爲一個),你可以將其設置爲不覆蓋任何現有的變量,和b)你可以有一個前綴,因此可以區分那些導入的變量。就像這樣:

extract ($_GET, EXTR_SKIP); 

對於$用戶,$模式,$ id,這將不覆蓋任何東西,或

extract ($_GET, EXTR_PREFIX_ALL, 'user_input'); 

爲$ user_input_mode,$ user_input_user,$ user_input_id等

+0

所以我不會使用它:)但thnks,我會熟悉此功能 –

+0

@ T_5警告並不嚴格關於此功能,而是關於一般的方法!使用帶有EXTR_SKIP的函數比您剛剛接受的答案更安全*,因爲它不會覆蓋當前變量,您可以將它們放在名稱空間中。 – eis

+0

thnks警告,所以你認爲你的方法是好的(用EXTR_SKIP提取的那個)或者通過表單數組獲取變量,或者可能使用其他方法?我需要獲取用戶選擇的變量並將其推送到代碼中,其中一些是PHP,一些MySQL查詢(取決於這些變量),然後執行一些圖表,結果。 –

2

使用數組,這正是他們的目的。命名的網址,如參數:

id[]=1&id[]=2&... 

然後$_GET['id']是一個數組,你可以很容易地遍歷。

許多IDS意味着你正在尋找一個數組ids,不ID1,ID2,ID3的等數組,可以訪問他們的虛擬方式$id[1]$id[2]等相同,但沒有頭痛需要放牧數百個獨立變量。

也不需要將$_GET中的每個值分配到它自己的變量中,您可以直接從$_GET使用這些值。通過將它們分配到單個變量中,它們並沒有變得更好。

+0

雖然不會幫助用戶,模式等。如果這些將被塞進相同的變量,那麼它實際上會比迭代'$ _GET'更糟。 – eis

+0

它不需要,每個只有一個。這是特別關於'id1','id2'等 – deceze

+0

這是一個好方法,但我會有更多不同的名稱(不僅id []),所以這不會幫助,但thnks :) –

0
function getIDs() 
{ 
    $ids = array(); 

    if(isset($_GET['id'])) 
    { 
     foreach($_GET['id'] as $key => $value) 
     { 
      $ids[$key] = $value; 
     } 
    } 
    return $ids; 
} 

如果你可以讓你的URL發送一個id GET參數數組到PHP腳本,你可以在上面的函數中解析$_GET['id']數組,假設URI看起來像?id[]=1&id[]=2&id[]=3

$ids = getIDs(); 
+0

嚴......你可以用'$ ids = $ _GET ['id']'替換那個循環。 – deceze

+0

@deceze我想告訴他如果'id'在URI中不存在,怎麼不發出警告。 –

+0

我在說你可以替換*循環*。你可以離開'isset'。您將所有鍵和值從一個數組轉換到另一個數組......這意味着您正在執行'$ arr1 = $ arr2'的複雜版本。 – deceze

-1

你可以寫

foreach($_GET as $key => $value) { 
     $$key=$value; 
    } 

這將每一個鍵名分配爲varibale。

+0

簡單而快捷,thnks :) –

+0

不要這樣做。它會覆蓋代碼中的任何匹配變量名稱,允許任何人注入任何變量。如果您需要這樣做,使用鏈接的提取物更好。 – eis

+0

eis你能否提出一些有用的解決方案呢?根據問題。 –