Olk Okenheld: mehrere neue Einträge in MySQL-Datenbank machen - Anzhal unbek.

Hallo zusammen,

ich habe ein Problem. Ich möchte mehrere Einträge (Zeilen) über "INSERT" in eine MySQL-Datenbank machen, weiß aber vorher nur, dass es zwischen einem und 40 Einträgen sein werden. Die exakte Zahl legt der Benutzer des Formulars fest.

Die Werte des Formulars werden mit POST übermittelt.

Prinzipiell würde ich die Einträge wie folgt aufrufen wollen:
... VALUES ('Name1', 'Anschrift1'), ('Name2', 'Anschrift2');

Die mit Post übergebenen Werte sind durchnummeriert wie im Beispiel, so dass es vielleicht über ein Schleife gehen könnte, allerdings komme ich im Moment einfach nicht drauf, mir fehlt immer wieder eine Kleinigkeit...

Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?

Wäre es vielleicht eine, wenn auch unelegante, Lösung, wenn einer der Werte in der Datenbank erzwungen ist und nicht = '' sein darf? Würde dann die Übertragung ohne Fehlermeldung abgebrochen und es würden nur die wirklichen Datensätze eingetragen?

Danke für eure Hilfe...

  1. Mahlzeit Olk Okenheld,

    Die Werte des Formulars werden mit POST übermittelt.

    ... und sehen wie genau aus (also das $_POST-Array)?

    Prinzipiell würde ich die Einträge wie folgt aufrufen wollen:
    ... VALUES ('Name1', 'Anschrift1'), ('Name2', 'Anschrift2');

    Aufrufen? Du meinst, dass Du die Werte gerne so in die Datenbanktabelle eintragen möchtest? Das sollte laut MySQL-Dokumentation durchaus möglich sein ...

    Die mit Post übergebenen Werte sind durchnummeriert wie im Beispiel, so dass es vielleicht über ein Schleife gehen könnte, allerdings komme ich im Moment einfach nicht drauf, mir fehlt immer wieder eine Kleinigkeit...

    Hm ... wie: nummeriert? Ist das nicht ein bisschen sinnfrei? Um was für Daten handelt es sich überhaupt, was steckt fachlich dahinter, *was genau* willst Du *eigentlich*?

    Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?

    Ähm ... jein?! Bitte formuliere Deine Problembeschreibung so, dass auch Leser ohne Glaskugel wissen, was Du meinst.

    Würde dann die Übertragung ohne Fehlermeldung abgebrochen und es würden nur die wirklichen Datensätze eingetragen?

    Vermutlich werden keine Datensätze eingetragen, wenn die entsprechende SQL-Abfrage nicht korrekt ist bzw. irgendwelche Constraints verletzt werden.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. ... und sehen wie genau aus (also das $_POST-Array)?

      Wenn der Benutzer z.B. zwei Datensätze übergibt wäre der erste Datensatz:
      $_POST['Name1']
      $_POST['Vorname1']
      $_POST['Anschrift1']
      der zweite wäre
      $_POST['Name2']
      $_POST['Vorname2']
      $_POST['Anschrift2']
      usw...

      Aufrufen? Du meinst, dass Du die Werte gerne so in die Datenbanktabelle eintragen möchtest? Das sollte laut MySQL-Dokumentation durchaus möglich sein ...

      Ja, sorry, ich meine eintragen...

      Die mit Post übergebenen Werte sind durchnummeriert wie im Beispiel, so dass es vielleicht über ein Schleife gehen könnte, allerdings komme ich im Moment einfach nicht drauf, mir fehlt immer wieder eine Kleinigkeit...

      Hm ... wie: nummeriert? Ist das nicht ein bisschen sinnfrei? Um was für Daten handelt es sich überhaupt, was steckt fachlich dahinter, *was genau* willst Du *eigentlich*?

      Im Eingabescript habe ich eine Schleife eingebunden, die an den allgemeinen Namen z.B. $Name eine Ziffer anhängt, eben beim ersten Datensatz ein 1, beim zweiten eine 2 usw. So dass alle Daten des ersten Datensatzes mit "1" enden und alle des zweiten mit "2"...

      Hier das Script aus dem Formular:

      						//Aufruf der Eingabemaske (for-Schleife)  
      						for ($i = $_POST["Anzahl"]; $i > 0; $i--)  
      						{  
      							//Inhalt der for-Schleife  
      							echo 'Bild ' . $Zahl . ':';  
      							echo '<br><br>';  
        
      							//Tag  
      							echo 'Tag:';  
      							echo "<br>";  
      							echo '<SELECT NAME="Tag' . $Zahl . '" class="Auswahl">';  
      								echo '<option value="1" selected="selected">1</option>';  
      								echo '<option value="2">2</option>';  
      								echo '<option value="3">3</option>';  
      								echo '<option value="4">4</option>';  
      								echo '<option value="5">5</option>';  
      								echo '<option value="6">6</option>';  
      								echo '<option value="7">7</option>';  
      								echo '<option value="8">8</option>';  
      								echo '<option value="9">9</option>';  
      								echo '<option value="10">10</option>';  
      								echo '<option value="11">11</option>';  
      								echo '<option value="12">12</option>';  
      								echo '<option value="13">13</option>';  
      								echo '<option value="14">14</option>';  
      								echo '<option value="0">NUR Sonstige</option>';  
      								echo '<option value="99">NUR Betreuer</option>';  
      							echo '</select>';  
      							  
      							echo "<br><br>";  
        
      							//Gruppe  
      							echo 'Gruppe:';  
      							echo "<br>";  
      							echo '<SELECT NAME="Gruppe' . $Zahl . '" class="Auswahl">';  
      								echo '<option value="1" selected="selected">1</option>';  
      								echo '<option value="2">2</option>';  
      							echo '</select>';  
      					  
      							echo "<br><br>";  
      					  
      							//Bildnummer  
      							echo 'Bildnummer (Dateiname)</span>:';  
      							echo "<br>";  
      							echo '<INPUT TYPE="text" NAME="Bildnummer' . $Zahl . '">';  
      					  
      							echo "<br><br>";  
      					  
      							//Titel  
      							echo 'Titel (des Bildes):';  
      							echo "<br>";  
      							echo '<INPUT TYPE="text" NAME="Text' . $Zahl . '">';  
      							  
      							echo "<br><br>";  
        
      							//Sonstige  
      							echo 'Sonstige:';  
      							echo "<br>";  
      							echo '<SELECT NAME="Sonstige' . $Zahl . '" class="Auswahl">';  
      								echo '<option value="0" selected="selected">nein</option>';  
      								echo '<option value="1">ja</option>';  
      							echo '</select>';  
      							  
      							echo "<br><br>";  
        
      							//Format  
      							echo 'Format:';  
      							echo "<br>";  
      							echo '<SELECT NAME="Format' . $Zahl . '" class="Auswahl">';  
      								echo '<option value="0" selected="selected">quer</option>';  
      								echo '<option value="1">hoch</option>';  
      							echo '</select>';  
      							  
      							echo "<br><br>";  
      							  
      							//Freigabe  
      							echo '<INPUT TYPE="checkbox" NAME="Freigabe' . $Zahl . '[]" size="30" value="1" checked="checked"> Bild freigeben';  
      							  
      							echo "<br><br>";  
      							  
      							echo '<hr>';  
      							$Zahl++;  
      							
      

      Hier der Versuch mit einer starren Eintragung in die Datenbank, im auswertenden Script:

      							$sql = "INSERT INTO ";  
      							$sql .= "$MainTable ";  
      							$sql .= "(Jahr, Tag, Gruppe, Bild, Text, Sonstige, Format, Freigabe) ";  
      							$sql .= "VALUES ";  
      							$sql .= "('" . $_POST["Jahr"] . "', '" . $_POST["Tag1"] . "', '" . $_POST["Gruppe1"] . "', '" . $_POST["Bildnummer1"] . "', '" . $_POST["Text1"] . "', '" . $_POST["Sonstige1"] . "', '" . $_POST["Format1"] . "', '" . $_POST["Freigabe1"] . "'),  
      							('" . $_POST["Jahr"] . "', '" . $_POST["Tag2"] . "', '" . $_POST["Gruppe2"] . "', '" . $_POST["Bildnummer2"] . "', '" . $_POST["Text2"] . "', '" . $_POST["Sonstige2"] . "', '" . $_POST["Format2"] . "', '" . $_POST["Freigabe2"] . "'),  
      							('" . $_POST["Jahr"] . "', '" . $_POST["Tag3"] . "', '" . $_POST["Gruppe3"] . "', '" . $_POST["Bildnummer3"] . "', '" . $_POST["Text3"] . "', '" . $_POST["Sonstige3"] . "', '" . $_POST["Format3"] . "', '" . $_POST["Freigabe3"] . "')";  
      	
      

      Bei diesem Versuch werden aber auch leere Zeilen in die Datenbank eingetragen.

      Hoff es ist jetzt verständlich...

      1. Mahlzeit Olk Okenheld,

        ... und sehen wie genau aus (also das $_POST-Array)?
        Wenn der Benutzer z.B. zwei Datensätze übergibt wäre der erste Datensatz:
        $_POST['Name1']
        $_POST['Vorname1']
        $_POST['Anschrift1']
        der zweite wäre
        $_POST['Name2']
        $_POST['Vorname2']
        $_POST['Anschrift2']

        Wie dedlfix bereits anmerkte wäre die Verwendung von Namen wie "Name[1]", "Vorname[1]", "Name[2]", "Vorname[2]" usw. sinnvoller, weil Du dann nämlich gleich entsprechende Arrays zur Verfügung hättest:

        $sql = '';  
          
        // Einmal durch alle übertragenen Daten laufen  
        for ($i = 1; $i <= 40; $i++) {  
          // Überprüfen, ob alle "Pflichtangaben" gemacht wurden (musst Du entsprechend Deinen Anforderungen umschreiben)  
          if (($_POST['Name'][$i] != '') && ($_POST['Vorname'][$i] != '')) {  
            $sql .= sprintf(", ('%s', '%s')", mysql_real_escape_string($_POST['Name'][$i]), mysql_real_escape_string($_POST['Vorname'][$i]));  
          }  
        }  
          
        if ($sql = '') {  
          $sql = sprintf("INSERT INTO %s (Name, Vorname) VALUES %s", $MainTable, substr($sql, 1));  
        }
        

        (Ungetesteter Code-Vorschlag)

        Insbesondere berücksichtigt dieser Code die von Dir sträflich vernachlässigten Kontextwechsel und minimiert das Risiko von Angriffen durch SQL-Injection (durch den Einsatz von mysql_real_escape_string()).

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hi EKKi.

          // Überprüfen, ob alle "Pflichtangaben" gemacht wurden (musst Du entsprechend Deinen Anforderungen umschreiben)
            if (($_POST['Name'][$i] != '') && ($_POST['Vorname'][$i] != '')) {

          Das ist keine sinnvolle Pruefung - die Variablen muessen darauf geprueft werden, ob sie vorhanden und(!) nicht leer sind.

          if ($sql =[=] '') {
            $sql = sprintf("INSERT INTO %s (Name, Vorname) VALUES %s", $MainTable, substr($sql, 1));
          }

            
          Hier mochte ich mal vehement den Ansatz verfechten, die Strings der Art ('Name', 'Vorname') in einem Array zu sammeln und per [implode](http://www.php.net/manual/de/function.implode.php) den String zu erzeugen. Diese substr-Kruecke ist schon recht unlesbar - meiner Meinung nach.  
            
            
          
          > und minimiert das Risiko von Angriffen durch SQL-Injection  
            
          Minimiert? Oder eliminiert?  
            
            
            
          Und ich haette da nochmal gerade ne Meinung zu [Deinem ersten Posting](https://forum.selfhtml.org/?t=198935&m=1336848):  
            
          
          > > Ähm ... jein?! Bitte formuliere Deine [Problembeschreibung](http://forum.de.selfhtml.org/hilfe/charta.htm#tipps-fuer-fragende) so, dass auch Leser ohne Glaskugel wissen, was Du meinst.  
            
            
          Auch wenn das Ausgangsposting keinen Preis fuer klare und exakte Formulierung gewinnt, ging daraus klar hervor, was das Problem war und wo die Denkfehler bzw. -luecken lagen. Wozu dieser Volkssport des Verlinkens der Tipps fuer Fragende?  
            
            
            
            
          Viele Gruesse,  
          der Bademeister
          
          1. Mahlzeit Bademeister,

            // Überprüfen, ob alle "Pflichtangaben" gemacht wurden (musst Du entsprechend Deinen Anforderungen umschreiben)
              if (($_POST['Name'][$i] != '') && ($_POST['Vorname'][$i] != '')) {

            Das ist keine sinnvolle Pruefung - die Variablen muessen darauf geprueft werden, ob sie vorhanden und(!) nicht leer sind.

            Deswegen schrieb ich ja auch, dass Olk das nach seinen Anforderungen umschreiben möge. Es ist mir klar, dass das *so* keine vernünftige Prüfung ist - ich habe lediglich ein exemplarisches Code-Grundgerüst gezeigt (und auch darauf hingewiesen, dass es ein solches ist).

            Hübscher Beißreflex ... ;-)

            Hier mochte ich mal vehement den Ansatz verfechten, die Strings der Art ('Name', 'Vorname') in einem Array zu sammeln und per implode den String zu erzeugen.

            Stimmt, die Möglichkeit mit einem Array wäre deutlich eleganter.

            Ähm ... jein?! Bitte formuliere Deine Problembeschreibung so, dass auch Leser ohne Glaskugel wissen, was Du meinst.

            Auch wenn das Ausgangsposting keinen Preis fuer klare und exakte Formulierung gewinnt, ging daraus klar hervor, was das Problem war und wo die Denkfehler bzw. -luecken lagen.

            Prinzipiell ja. Allerdings konnte ich mit dem von mir zitierten - und von Dir (bewusst?) ausgelassenen - Satz ...

            "Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?"

            ... irgendwie gar nichts anfangen (inhaltlich könnte ich erahnen, was er meinte - aber allein schon syntaktisch/semantisch verknotet sich da mein Resthirn). Deswegen der Hinweis, der Fragesteller möge sich doch bitte etwas mehr Mühe beim Formulieren geben, damit die Leser auch wissen, was er meint.

            Wozu dieser Volkssport des Verlinkens der Tipps fuer Fragende?

            Ich bin der Meinung, dass man sie gar nicht oft genug verlinken kann, da ich über die Jahre hinweg den Eindruck gewonnen habe, dass insbesondere Erst- oder Jungposter die Charta (und damit ebendiese Tipps, die ja durchaus ihren Sinn haben) nie wirklich gelesen, geschweige denn verstanden haben ... obwohl sie das alle mit dem Absenden bzw. mit der Registrierung bestätigen getan zu haben.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hi!

    Ich möchte mehrere Einträge (Zeilen) über "INSERT" in eine MySQL-Datenbank machen, weiß aber vorher nur, dass es zwischen einem und 40 Einträgen sein werden. Die exakte Zahl legt der Benutzer des Formulars fest.

    Legt er die Zahl explizit fest oder ergibt sie sich beispielsweise aus der Anzahl ausgefüller oder Felder? Ihre Zahl ist nicht wichtig, aber die Art, wie die Daten übergeben werden (sollen).

    Die mit Post übergebenen Werte sind durchnummeriert wie im Beispiel, so dass es vielleicht über ein Schleife gehen könnte, allerdings komme ich im Moment einfach nicht drauf, mir fehlt immer wieder eine Kleinigkeit...

    Durchnummeriert als foo1, foo2, ... oder als foo[1], foo[2], ...?

    Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?

    Auf ein clientseitiges Anpassen der gesendeten Werte würde ich nicht nicht verlassen wollen. Das eintragende Script sollte prüfen, ob alle Daten vorhanden sind und welche aufgrund bestimmter Merkmale nicht bearbeitet werden sollen.

    Wäre es vielleicht eine, wenn auch unelegante, Lösung, wenn einer der Werte in der Datenbank erzwungen ist und nicht = '' sein darf? Würde dann die Übertragung ohne Fehlermeldung abgebrochen und es würden nur die wirklichen Datensätze eingetragen?

    Das kommt zum einen auf die Constraints der Felder an. Da bist du aber auf NULL vs. NOT NULL und UNIQUE-Werte über die gesamte Tabelle beschränkt. Ein Trigger lässt sich zur Überprüfung nicht verwenden, höchstens missbrauchen, weil es keine gescheite Art gibt, selbst einen Fehler auszulösen.
    Bei Leerstrings aus dem Formular kommt noch hinzu, dass du da nicht automatisch auf NULL kommst, das also händisch prüfen musst und dann auch gleich dabei die Verarbeitung verhindern kannst.

    Zum anderen kommt es auf die Formulierung des INSERT-Statements an. Die Möglichkeiten, das Verhalten über diverse Schlüsselwörter (z.B. IGNORE) zu steuern, findest du im MySQL-Handbuch. Du musst dabei aber im Auge behalten, was für dich in welchem (Fehler-)Fall die geeignetste Reaktion ist.

    Wo genau ist denn das Problem angesiedelt? Fehlt es an einer Idee, wie die Benutzer-Daten im Script erkannt werden können, wie deren Inhalt zwischen gewünscht und nicht gewünscht unterschieden werden kann, an der Formulierung eines Multi-Insert-SQL-Statements mit unterschiedlich langer Datensatzanzahl oder der Formulierung einer Schleife mit einzelnen Insert-Statements?

    Lo!

    1. Ich möchte mehrere Einträge (Zeilen) über "INSERT" in eine MySQL-Datenbank machen, weiß aber vorher nur, dass es zwischen einem und 40 Einträgen sein werden. Die exakte Zahl legt der Benutzer des Formulars fest.

      Legt er die Zahl explizit fest oder ergibt sie sich beispielsweise aus der Anzahl ausgefüller oder Felder? Ihre Zahl ist nicht wichtig, aber die Art, wie die Daten übergeben werden (sollen).

      Er wählt mittels Select-Feld aus, wie viele Eingabefelder er bekommt, die er dann ausfüllen kann...

      Die mit Post übergebenen Werte sind durchnummeriert wie im Beispiel, so dass es vielleicht über ein Schleife gehen könnte, allerdings komme ich im Moment einfach nicht drauf, mir fehlt immer wieder eine Kleinigkeit...

      Durchnummeriert als foo1, foo2, ... oder als foo[1], foo[2], ...?

      ersteres Name1, Name2, Name3 und das eben mit allen Daten, so dass man an der zahl erkennen kann zu welchem Datensatz sie gehören... ich habe nicht mit einem Array gearbeitet, würde das das ganze vereinfachen?

      Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?

      Auf ein clientseitiges Anpassen der gesendeten Werte würde ich nicht nicht verlassen wollen. Das eintragende Script sollte prüfen, ob alle Daten vorhanden sind und welche aufgrund bestimmter Merkmale nicht bearbeitet werden sollen.

      Hm, prinzipiell richtig, aber da der Nutzer im Prinzip "Nur" aus Vorgaben auswählt bzw. in zwei Felder Namen oder ähnliches einträgt, kann er nciht viel falsch machen und bei den Feldern, die er einträgt wäre es zumindest bei einem möglich, dass wirklich kein Wert vorhanden ist. Bei dem zweiten wäre meine Idee gewesen, eben dieses als Kriterium zu nutzen, falls ab dieser Zeile der Abbruch stattfinden soll und die folgenden Daten nicht mehr eingetragen werden.

      Wo genau ist denn das Problem angesiedelt? Fehlt es an einer Idee, wie die Benutzer-Daten im Script erkannt werden können, wie deren Inhalt zwischen gewünscht und nicht gewünscht unterschieden werden kann, an der Formulierung eines Multi-Insert-SQL-Statements mit unterschiedlich langer Datensatzanzahl oder der Formulierung einer Schleife mit einzelnen Insert-Statements?

      Meine Idee war als einen zusätzlichen Wert die Zahl der Datensätze, die der Anwender auswählt mit zu übergeben...
      Dann hätte ich den Wert, um im zweiten Formular festzulegen, bis zu welchem Punkt ich den INSERT-Befehl ausführe, allerdings gelingt es mir nicht die Klammern des INSERT "on-the-fly" zu erstellen, das war bisher mein Lösungsansatz.
      Ich bin mir aber auch nicht sicher, dass das überhaupt funktionieren würde.

      Vielleicht wäre auch ein Array eine Lösung, da hängt es aber im Moment auch bei mir, wie ich die Daten dann im Array zusammenführe um sie dann im zweiten Script wieder zusammen zu führen...

      1. Hi!

        Er wählt mittels Select-Feld aus, wie viele Eingabefelder er bekommt, die er dann ausfüllen kann...

        Gut, aber letztlich entscheidet nicht diese Anzahl sondern das was er tatsächlich davon ausgefüllt hat, entnehme ich deinen anderen Worten.

        Durchnummeriert als foo1, foo2, ... oder als foo[1], foo[2], ...?
        ersteres Name1, Name2, Name3 und das eben mit allen Daten, so dass man an der zahl erkennen kann zu welchem Datensatz sie gehören... ich habe nicht mit einem Array gearbeitet, würde das das ganze vereinfachen?

        Jein. Du ersparst dir mit einem Array den zusätzlichen Schritt, den Namen aus Feldnamen und einer Nummer zusammenzusetzen, wenn du gezielt zugreifen willst. Oder wenn du über die Daten in $_POST iterierst, musst du zu Fuß Namen und Nummer trennen, um die Nummer zu erlangen. Mit einem Array entstehen solche Probleme nicht. Es kommt aber drauf an, was du konkret implementieren willst, u.U. sind die Nachteile eines kombinierten Namens weniger relevant. So ein Array hat jedoch den Vorteil, wenn es richtig aufgesetzt ist, dass bestimte Daten schon zusammenhängend vorliegen und du nicht mit Einzelwerten hantieren musst.

        Statt Name[x] und Vorname[x] bietet es sich an, die Feldnamen nach diesem Prinzip zu wählen: Item[x][Name], Item[x][Vorname]

        Du kannst dann zum Beispiel mit foreach ($_POST['Item'] as $key => $item) über alle Datensätze iterieren, hast deren Nummer in $key stehen (wenn du die für irgendwas benötigst) und in $item stehen schön als Array zusammengefasst alle Daten eines Eintrags ($item['Name'], $item['Vorname'] zum Zugriff verwenden).

        Da ich jetzt aber nicht weiß wie viele Datensätze im konkreten Fall eingetragen werden sollen ich aber auch nicht eine Unmenge an leeren Datensätzen erzeugen will hilft es auch nicht, einfach alle Werte zu übergeben?
        Auf ein clientseitiges Anpassen der gesendeten Werte würde ich nicht nicht verlassen wollen. Das eintragende Script sollte prüfen, ob alle Daten vorhanden sind und welche aufgrund bestimmter Merkmale nicht bearbeitet werden sollen.
        Hm, prinzipiell richtig, aber da der Nutzer im Prinzip "Nur" aus Vorgaben auswählt bzw. in zwei Felder Namen oder ähnliches einträgt, kann er nciht viel falsch machen und bei den Feldern, die er einträgt wäre es zumindest bei einem möglich, dass wirklich kein Wert vorhanden ist.

        Egal, ob der Nutzer mit Absicht oder aus Versehen was leeres sendet, du musst es filtern.

        Bei dem zweiten wäre meine Idee gewesen, eben dieses als Kriterium zu nutzen, falls ab dieser Zeile der Abbruch stattfinden soll und die folgenden Daten nicht mehr eingetragen werden.

        Allerdings würde ich nicht auf irgendeinen Abbruch setzen, sondern in einer ersten Schleife die Daten durchlaufen und die Spreu vom Weizen sondern. Die guten ($item) kommen in ein weiteres Array, die anderen nicht. Und mit diesem "Weizen-Array" gehst du dann die SQL-Behandlung an.

        Mit weniger Aufwand und aber auch weniger Trennung des Scripts in Teilaufgaben, kannst du auch die Aussonderung sparen und gleich die guten in ein SQL-Statement einsetzen, den Rest übergehen.

        Meine Idee war als einen zusätzlichen Wert die Zahl der Datensätze, die der Anwender auswählt mit zu übergeben...
        Dann hätte ich den Wert, um im zweiten Formular festzulegen, bis zu welchem Punkt ich den INSERT-Befehl ausführe, allerdings gelingt es mir nicht die Klammern des INSERT "on-the-fly" zu erstellen, das war bisher mein Lösungsansatz.

        Du kannst auch wie folgt vorgehen: Erstelle vorab ein leeres Array. Iteriere über alle $_POST['Item'] und prüfe zunächst, ob das Item eingetragen werden soll oder nicht. Wenn ja, bilde mit

        sprintf('('%s', '%s', ...)', mysql_real_escape_string($item['Name']), mysql_real_escape_string($item['Vorname']), ...);

        die einzelnen Datensatz-Statement-Teile, also nur die geklammerten Werten. Diesen String (das Ergebnis von sprintf()) hängst du an das vorab erstellte Array an. Nach dem Ende der Schleife kannst du das Array mit einem Komma als "Klebstoff" implodieren lassen und hast das, was du hinter VALUES hängen kannst.

        Vielleicht wäre auch ein Array eine Lösung, da hängt es aber im Moment auch bei mir, wie ich die Daten dann im Array zusammenführe um sie dann im zweiten Script wieder zusammen zu führen...

        Du hattest beim Formulieren deine Gedanken und die schon fertigen Codeteile dazu im Kopf. Ich nicht und verstehe deshalb nicht genau, was du mir da konkret erzählen willst :-) Aber vielleicht macht das nichts, und du findest meine Vorschläge sowieso viel besser ...

        Lo!