2010-09-17 39 views
2

我是在製造一種形式,嗯......相當大,所有投入由形式看起來像通過每個「名稱」值的形式投入動態創建變量

<input type="text" id="first_name" name="first_name" /> 

因此而不必做

$first_name = $_POST['first_name']; 

等對於每個輸入,有一個方法抓住每一個「名稱」或「ID」從每個輸入的<form></form>內並適用於「名稱」或「的相同值的可變ID'。

我在想像foreach聲明?

任何想法?

編輯:

鑑於這個代碼小片段在這裏,怎麼能使用到現在使用下面給出的例子嗎?

function filter($data) { 
    $data = trim(htmlentities(strip_tags($data))); 

    if (get_magic_quotes_gpc()) 
     $data = stripslashes($data); 

    $data = mysql_real_escape_string($data); 

    return $data; 
} 

foreach($_POST as $key => $value) { 
    $data[$key] = filter($value); 
    echo $value . '<br />'; 
} 
+0

這是你能想到的永遠最糟糕的事情。此外,你只是不需要它 – 2010-09-17 08:18:57

+0

我建議不要去任何你不知道輸入的方法,並且從某種意義上來說不能控制它,這樣可以保證你的應用程序/服務器不會被注入。 – Jakub 2010-09-17 12:24:57

回答

2

這樣一個變量賦值是非常糟糕的主意。惡意用戶可以用這種方式重寫程序中的任何變量。
千萬不要做這樣的事情。
對於foreach語句你是對的。但是不要用它來設置變量 - 只是用它來實現腳本目標。迭代$ _POST並將其值放入查詢或郵件正文或其他內容中。不需要全局範圍變量

如上所述,使用foreach來實現真正的自動化。
您可以使用此功能來產生SET SQL語句進行字段名的數組和$ _POST數組:

function dbSet($fields) { 
    $set=''; 
    foreach ($fields as $field) { 
    if (isset($_POST[$field])) { 
     $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', "; 
    } 
    } 
    return substr($set, 0, -2); 
} 

$fields = explode(" ","name surname lastname address zip fax phone"); 
$query = "INSERT INTO $table SET ".dbSet($fields); 
+0

+1完全同意 – 2010-09-17 08:27:31

+0

等待你的意思迭代並放入查詢或郵件的兄弟。我的目標是讓我可以減少我的工作,並自動將我的表單添加到我的數據庫。 – Eli 2010-09-17 09:09:09

+0

我不確定那裏發生了什麼。我可以看到該函數需要$ field並將其傳遞到foreach語句中,但我沒有得到的是$ _post [$ field]應該是什麼。那麼爆炸數組,那是什麼?名字姓名姓氏數據從哪裏被取出? – Eli 2010-09-17 09:47:56

5

這是使用extractforeach一個壞主意,它將使你的代碼有人劫持的變量。

設想以下

$my_user_id = 10; 
extract($_POST); 
// Load the user for $my_user_id using MYSQL 
// Change some value of the user for $my_user_id 
// Update the database for user $my_user_id 

當用戶黑客您的形式和改變的my_user_id價值會發生什麼?

他們將能夠更改您希望他們更改的用戶以外的用戶的值。

您應該只知道您知道的$_POST的值,並且應該在那裏。不要抓住一切,並假設它是在那裏。