2016-04-17 13 views
0

speichern 6 invoce Produkte von einer Website über eine form method="post", verwende ich mehrere Eingabeelemente wie diesePDO/mySQL Wie mehrere Werte zu binden, mehrere Zeilen speichern

<input name="item[]" value="6 hour service"/> 
    <input name="item[]" value="1 days travel"/> 
.... 

Server kopieren I $ _POST [ ‚Item‘ ] auf ein Array wie diese

item[]= $_POST['Item']; 

Dann kann ich Artikel [] zugreifen und es sieht aus wie dieses

[item] => Array 
    ( 
     [0] => 6 hour service 
     [1] => 1 days travel 
     [2] => .... 
    ) 

Dann folgt diese SQL-Anweisung

try { 
    $obj = $this->dbcon->prepare('INSERT INTO invoice_item 
       (ID, item) 
      VALUES(:ID,:item)'); 

      for ($i=0;$i<6;$i++) { 

      if (!empty($item[0][$i])) { 
       $obj->bindValue(':ID', $this->dbcon->lastInsertId(), PDO::PARAM_INT); 
       $obj->bindValue(':item', $item[0][$i], PDO::PARAM_STR); 
       $succ = $obj->execute(); 
       } 
      } 
    } 

    catch(PDOException $e) { 
     echo "Error: " . $e->getMessage(); 
    } 

Dies funktioniert für eine feste Anzahl von Elementen.
Aber was ist der richtige Weg, um auf $ _POST zuzugreifen, es zu binden und es zu speichern, wenn die Anzahl der Elemente nicht bekannt ist?

EDIT:

Wie über $ _POST [ "Item"] direkt iterieren?

+0

-> lastInsertId() ist aus einer vorherigen Tabelle, die ich später beziehen muss – Ben

Antwort

0

Überprüfen Sie, ob $i kleiner als die Anzahl der Elemente ist und nicht kleiner als ein fester Wert.

 for ($i=0;$i<count($item[0]);$i++) { 

     if (!empty($item[0][$i])) { 

alternativ könnten Sie foreach verwenden:

 foreach ($item[0] as $value) { 

     if (!empty($value)) { 
+0

Großartig - Ist es auch möglich, direkt auf $ _POST [item] zuzugreifen, anstatt eine temporäre [] Kopie zu erstellen? – Ben

+0

Ja, Sie sollten auch direkt über '$ _POST [" Item "] 'iterieren können. – Chris

0

Zunächst einmal müssen Sie nicht unbedingt die ID binden, weil sie sich von der Db werden. Dann können Sie eine eindeutige Abfrage verwenden.

Holen Sie sich das ID:

$id = $this->dbcon->lastInsertId(); 

Filter $_POST['Item'] zu leeren Werte zu verwerfen:

$items = array_values(array_filter($_POST['Item'])); 

eine Zeichenfolge mit Ihrer Anfrage erstellen:

$query = substr("INSERT INTO invoice_item (ID, item) VALUES " . str_repeat("($id, ?),", count($items)), 0, -1); 

Unter der Annahme einer $_POST['Items'] mit drei nicht- leere Werte und id = 3, jetzt.210 ist:

INSERT INTO invoice_item (ID, item) VALUES (3, ?),(3, ?),(3, ?) 

Jetzt können Sie die Abfrage erstellen und verbindlich alle Parameter auf einmal ausgeführt wird (ein Array als ->execute Argument, Parameter binden als Strings):

$obj = $this->dbcon->prepare($query); 
$obj->execute($items); 
+0

Hm, das ist neu für mich, ich muss das überprüfen und wieder darauf kommen ;-) – Ben

+0

Großartig es funktioniert, sieht gut aus. Es gibt 2 weitere Spalten, die mit "Gebühr" und "Datum" zu versorgen sind. Wie integriert man sie? – Ben