2010-09-17 37 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的值,并且应该在那里。不要抓住一切,并假设它是在那里。