2015-03-25 32 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