2015-03-25 63 views
2

我是PDO和关联数组的新手,但我正在取得不错的进展。我已经建立了这个代码HTML表单保存到一个记录:

$str_sql = "UPDATE tbl_benutzer SET "; 
    foreach($_POST as $key=>$value){ 
     if($key=='id'){continue;} 
     $str_sql .= $key." = :".$key.", "; 
    } 
    $str_sql = substr($str_sql,0,-2)." WHERE id = :id"; 

    ///////SAVE DATA TO DB/////// 
    $stmt = $conn->prepare($str_sql); 
    $stmt->execute($_POST); 

现在我想以适应相同的代码的HTML表单的内容保存到多个记录。这里的HTML:

<input name="id[]" value="1"> 
<input name="tarif[]" value="A"> 
<input name="mitgliedschaft[]" value="X"> 
<input name="gebuehr[]" value="100"> 

<input name="id[]" value="2"> 
<input name="tarif[]" value="B"> 
<input name="mitgliedschaft[]" value="Y"> 
<input name="gebuehr[]" value="200"> 

<input name="id[]" value="3"> 
<input name="tarif[]" value="C"> 
<input name="mitgliedschaft[]" value="Z"> 
<input name="gebuehr[]" value="300"> 

而这里的$ _POST数组:

Array ([id] => Array ([0] => 1 [1] => 2 [2] => 3) 
[tarif] => Array ([0] => A [1] => B [2] => C) 
[mitgliedschaft] => Array ([0] => X [1] => Y [2] => Z) 
[gebuehr] => Array ([0] => 100 [1] => 200 [2] => 300)) 

这是我到目前为止已经试过,但我的头只是没有得到它周围!:

$str_sql = "UPDATE tbl_stamm_tarif SET "; 
    foreach($_POST as $key=>$value){ 
     if($key=='id'){continue;} 
     $str_sql .= $key." = :".$key.", "; 
    } 
    $str_sql = substr($str_sql,0,-2)." WHERE id = :id"; 
    echo $str_sql; 

    ///////SAVE DATEN TO DB/////// 
    $stmt = $conn->prepare($str_sql); 
    foreach($_POST as $key=>$value){ 
     foreach($value as $key2=>$value2){ 
      $stmt->execute(array($key=>$value2)); 
     } 
    } 

在此先感谢您的帮助!

回答

2

我会考虑改变你的HTML结构是这样的:

<input name="**model_name**[**id1**][tarif]" value="A"> 
<input name="**model_name**[**id1**][mitgliedschaft]" value="X"> 
<input name="**model_name**[**id1**][gebuehr]" value="100"> 

<input name="**model_name**[**id2**][tarif]" value="B"> 
<input name="**model_name**[**id2**][mitgliedschaft]" value="Y"> 
<input name="**model_name**[**id2**][gebuehr]" value="200"> 

(对于UPDATE页面,你真的不应该被允许改变id

这样,你可以只遍历通过型号为:

foreach($_POST['**model_name**'] as $id=>$model){} 

和执行之前在每次迭代的UPDATE

UPDATE

我也很警惕你的代码,因为它是巨大的容易受到SQL注入。您应该打屁股直入一个语句之前真的检查每一个$key针对已知列的值。否则,用户可以提交自己的$key并打开数据库。

更新2

无论是从数据库中提取的列,或硬编码他们到任何PHP模型类使用的是作为一个数组(节省了行程,但如果你改变了模式需要做的)。

在运行SQL之前,我可能会将值分配给$_POST数组中的模型类中的键控阵列,因为稍后可能需要它们。

N.B.

很多这些问题已经在各种框架中解决了;不知道你的项目是什么(可能正在编写一个框架),但对于任何人在这个框架中陷入困境都可以节省大量的工作和安全漏洞!

+0

谢谢。作品一种享受!你认为什么是阻止国外注射的更好方法? 1.从数据库中获取列名并将它们与键进行比较,或者2.从数据库获取列名并从那里构建sql语句。 – 2015-03-26 11:07:14

+1

@RichardTinkler NP。看到更新:)噢,如果你使用这个答案,请接受! – Arth 2015-03-26 14:41:06

+0

谢谢关节。听起来像我正在重新发明轮子!你会推荐哪些框架来简单选择,更新和插入? – 2015-03-27 08:27:34