2011-04-22 18 views
3

我正在嘗試將網站從一臺主機遷移到另一臺主機。在第一臺主機上,當你提交一個表單時,所有的表單值都會自動粘貼到輸入名稱(這是PHP)的變量中。在新的主機,這些值均爲空,除非我這樣做:如何在PHP中獲取所有提交的表單值並自動將它們分配給變量?

$data = $_GET['data'];

是否有導致此PHP的配置設置?如果沒有,是否有簡單的方法循環遍歷所有$ _GET變量並自動將它們的值賦給一個具有相同名稱的變量?

謝謝!

+2

配置是'register_globals',可以通過'extract($ _ GET);'來模擬。但是真的,***不要做這個***。 'register_globals'已被棄用 - 它存在嚴重的安全問題。相反,更好的重寫你的代碼。 – NikiC 2011-04-22 15:52:20

回答

6

該設置是register_globals,但現在已被棄用,強烈建議不要使用它,因爲它存在安全風險。任何人都可以在腳本中設置可能與您的代碼以負面或意想不到的方式進行交互的變量。

如果你絕對必須,你可以做這樣的:

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

,或者更簡單地說:

import_request_variables("g"); 

,或者使它稍微更安全:

import_request_variables("g", "myprefix_"); // This way forces you to use "myprefix_" 
// in front of the variables, better ensuring you are not unaware 
// of the fact that this can come from a user 

提取($ _GET)也可以像其他人指出的那樣工作,它還允許指定(通過額外的參數)添加前綴或什麼如果你的提取與已經存在的變量衝突(例如,如果你在定義了其他變量後提取)。

1

你可以做這樣的事情:

foreach ($_GET["data"] as $name => $value){ 
    $$name = $value; 
} 

這樣做的問題是,它很容易讓人們在你的腳本變量撥弄。我可以訪問http://yoursite.com/?sql=DELETE+FROM ...

我建議不要這樣做,只是堅持使用$ _GET。

0

你的問題推斷分配時$ _GET [「數據」]到$的數據,除非你正在做這幾樣檢查的進一步下跌腳本你沒有做任何過濾或驗證。

從我所看到的大多數程序員會做這第一個,在努力,如果預期的數據沒有達到預期,所以,在期待一個積極INT的情況下,上述的分配將成爲早期失敗是這樣的:

if(isset($_GET['data']) && (int)$_GET['data'] === 0){ 
//fail 
}else{ 
$data = $_GET['data']; 
} 

所以看到只是普通

$data = $_GET['data'] 

讓我退避三舍。

相關問題