Franky: MYSQL mehrere Daten gleichzeitig eintragen

Moin alle zusammen, ich habe ein Problem und hoffe das mir jemand helfen kann. Und zwar will ich das mann mehrere Daten gleichzeitig eintragen kann. Ich hab das so gemacht das in dem Formular die Felder mit einer for-Schleife dargestellt werden und mit der jeweilige Nummer benannt werden. In PHP hab ich das jetzt so, das der prüft wie viele Daten abgeschickt wurden und dann so oft die Query ausführt bis die anzahl erreicht ist. Das eintrage und alles klappt auch schon, jedoch trägt er nicht immer alles ein. Wenn ich alle Felder ausfülle fehlt meistens das 1. und das letzte Feld in der Tabelle. Hat jemand eine Idee woran das liegt?

Der PHP-Code:

<?php
$anzahl = count($_POST);
for($a = 1; $a <= $anzahl; $a++){
$query = sprintf(
       "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
	VALUES ('%s', '%s', '%s', '%s', '%s')",
	$mysqli->real_escape_string($_POST['stueck']),
	$mysqli->real_escape_string($_POST['rolle'][$a]),
	$mysqli->real_escape_string($_POST['vorname'][$a]),
	$mysqli->real_escape_string($_POST['nachname'][$a]),
	$mysqli->real_escape_string($_POST['zusatz'][$a])
);
$mysqli->query($query);
}
?>

Der Formular-Code


<?php for($i = 1; $i <= 6; $i++):	?>
        <tr>
	        <td><input type="text" name="nr" hidden value="<?php echo $i;	?>"><?php echo $i;	?></td>
		<td><input type="text" name="rolle[<?php echo $i;	?>]" list="aufgabe"></td>
		<td><input type="text" name="vorname[<?php echo $i;	?>]"></td>
		<td><input type="text" name="nachname[<?php echo $i;	?>]"></td>
		<td><input type="text" name="zusatz[<?php echo $i;	?>]"></td>
	</tr>
<?php endfor;	?>
  1. Tach!

    Wenn ich alle Felder ausfülle fehlt meistens das 1. und das letzte Feld in der Tabelle. Hat jemand eine Idee woran das liegt?

    Dann solltest du mal debuggen. Schritt für Schritt nachvollziehen, was dein Programm da macht. Gib die beteiligten Daten zur Kontrolle mit var_dump() aus.

    dedlfix.

    1. Gib die beteiligten Daten zur Kontrolle mit var_dump() aus.

      Hab das gemacht, werde da aber irgendwie nicht schlau raus.

      string(5) "volks" string(6) "cfghbj" string(6) "vghbnj" string(5) "fgvhj" string(5) "vhbjn" string(5) "volks" string(7) "vghbjnk" string(6) "vghbjn" string(7) "vghbjnk" string(6) "vghbjn" string(5) "volks" string(3) "vfg" string(6) "hvghjn" string(7) "vgzbuhn" string(5) "ztgub" string(5) "volks" string(5) "vzbzu" string(7) "niuvzgb" string(8) "hnvgzbuh" string(7) "jvzgbuh" string(5) "volks" string(7) "vzgbuhn" string(9) "ijvzgbuhn" string(6) "jvzguh" string(6) "jvzbuh" string(5) "volks" string(6) "jgbuhn" string(6) "jvzguh" string(9) "njgzbuhji" string(5) "uzhij" string(5) "volks" NULL NULL NULL NULL

      Das ist das was der ausgibt. String ist klar, aber was sollen die Zahlen?? Sry aber ich bin noch nicht solange am Programmieren...

      1. Tach!

        Das ist das was der ausgibt. String ist klar, aber was sollen die Zahlen??

        Das ist die Länge in Bytes. Achja, vorher ein <pre> ausgeben erhöht die Übersichtlichkeit, besonders bei komplexten Typen wie Arrays.

        Das kann aber noch nicht alles sein. Zu den Beteiligten zählt der Inhalt von $_POST, also var_dump($_POST), das was die Funktion count ermittelt und du in $anzahl ablegst, das $a innerhalb der Schleife, das was z.B. in $_POST['rolle'][$a] steht und auch der Inhalt von $query nach dem sprintf()-Aufruf.

        dedlfix.

        1. Zu den Beteiligten zählt der Inhalt von $_POST, also var_dump($_POST), das was die Funktion count ermittelt und du in $anzahl ablegst, das $a innerhalb der Schleife, das was z.B. in $_POST['rolle'][$a] steht und auch der Inhalt von $query nach dem sprintf()-Aufruf.

          So dann hab ich jetzt folgende ausgabe:

          array(7) {
            ["stueck"]=>
            string(5) "volks"
            ["senden"]=>
            string(18) "Rollen hinzufügen"
            ["nr"]=>
            string(1) "6"
            ["rolle"]=>
            array(6) {
              [1]=>
              string(10) "fcvzgubhni"
              [2]=>
              string(8) "vzgbuhnj"
              [3]=>
              string(3) "vgz"
              [4]=>
              string(4) "gbhn"
              [5]=>
              string(6) "mbuzni"
              [6]=>
              string(3) "ubz"
            }
            ["vorname"]=>
            array(6) {
              [1]=>
              string(7) "zvubhni"
              [2]=>
              string(4) "zubh"
              [3]=>
              string(3) "jvg"
              [4]=>
              string(6) "jmgbuh"
              [5]=>
              string(7) "oubzniu"
              [6]=>
              string(7) "ubniumo"
            }
            ["nachname"]=>
            array(6) {
              [1]=>
              string(7) "ztguhij"
              [2]=>
              string(9) "ijvgzubhn"
              [3]=>
              string(11) "buhnjigbuhn"
              [4]=>
              string(7) "njimbuh"
              [5]=>
              string(6) "bniumi"
              [6]=>
              string(5) "uznim"
            }
            ["zusatz"]=>
            array(6) {
              [1]=>
              string(6) "zubhij"
              [2]=>
              string(6) "jgbuhn"
              [3]=>
              string(9) "jmgbuhnjm"
              [4]=>
              string(8) "mkbuhnji"
              [5]=>
              string(6) "bzuiun"
              [6]=>
              string(6) "ubznim"
            }
          }
          int(7)
          string(5) "volks"
          string(10) "fcvzgubhni"
          string(7) "zvubhni"
          string(7) "ztguhij"
          string(6) "zubhij"
          string(142) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'fcvzgubhni', 'zvubhni', 'ztguhij', 'zubhij')"
          string(5) "volks"
          string(8) "vzgbuhnj"
          string(4) "zubh"
          string(9) "ijvgzubhn"
          string(6) "jgbuhn"
          string(139) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'vzgbuhnj', 'zubh', 'ijvgzubhn', 'jgbuhn')"
          string(5) "volks"
          string(3) "vgz"
          string(3) "jvg"
          string(11) "buhnjigbuhn"
          string(9) "jmgbuhnjm"
          string(138) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'vgz', 'jvg', 'buhnjigbuhn', 'jmgbuhnjm')"
          string(5) "volks"
          string(4) "gbhn"
          string(6) "jmgbuh"
          string(7) "njimbuh"
          string(8) "mkbuhnji"
          string(137) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'gbhn', 'jmgbuh', 'njimbuh', 'mkbuhnji')"
          string(5) "volks"
          string(6) "mbuzni"
          string(7) "oubzniu"
          string(6) "bniumi"
          string(6) "bzuiun"
          string(137) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'mbuzni', 'oubzniu', 'bniumi', 'bzuiun')"
          string(5) "volks"
          string(3) "ubz"
          string(7) "ubniumo"
          string(5) "uznim"
          string(6) "ubznim"
          string(133) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', 'ubz', 'ubniumo', 'uznim', 'ubznim')"
          string(5) "volks"
          NULL
          NULL
          NULL
          NULL
          string(112) "INSERT INTO `rollen`(`stueck`, `rolle`, `vorname`, `nachname`, `zusatz`) 
          					VALUES ('volks', '', '', '', '')"
          

          Also das in dem Array ist ja das was mit $_POST übergeben wird. Das versteh ich ja noch und die Querys scheinen ja auch richtig zu sein, außer das die letzt Leer ist. Aber warum ist $anzahl 7, wenn das eigentlich maximal 6 sein kann? Oder muss die for-Schleife dann <6 und nicht <=6 heißen?

          1. Tach!

            Also das in dem Array ist ja das was mit $_POST übergeben wird. Das versteh ich ja noch und die Querys scheinen ja auch richtig zu sein, außer das die letzt Leer ist. Aber warum ist $anzahl 7, wenn das eigentlich maximal 6 sein kann?

            Du hast da ein verschachteltes Array. Das äußere hat 7 Elemente (mit den Keys stueck, senden, nr, rolle, vorname, nachname und zusatz)

            Oder muss die for-Schleife dann <6 und nicht <=6 heißen?

            Die geht ja nicht über $_POST sondern über $_POST['rolle'] usw. Da sind ja jeweils 6 Einträge, nummeriert von 1 bis 6.

            Du zählst mit count() die 7 Einträge des äußeren Arrays. Die Zahl ist aber für dich nicht weiter relevant, denn deine eigentlichen Elemente, die du zählen willst, stehen in $_POST['rolle'] usw.

            dedlfix.

  2. Wenn ich alle Felder ausfülle fehlt meistens das 1. und das letzte Feld in der Tabelle. Hat jemand eine Idee woran das liegt?

    Ja. Du liest ein Feld mit Namen 'stueck' ein, das es in deinem Formular nicht gibt. Es muss also immer leer sein.

    Im Formular hast du sechs Felder mit demselben Namen name="nr"

    • vier arrays mit je 6 Namen:
    nr
    nr
    nr
    nr
    nr
    nr
    rolle[1], rolle[2], ... [6]
    vorname[1], vorname[2], ... [6]
    nachname[1], nachname[2], ... [6]
    zusatz[1], zusatz[2], ... [6]
    

    Wenn du nun $anzahl = count($_POST); zählst, könnte das 10 ergeben, wobei ich nicht weiss, wie die verschiedenen Browser den Fehler mit den 6 nr interpretieren.

    $anzahl = count($_POST);
    echo "[".$anzahl."]"<br>";
    

    Du erwartest wahrscheinlich die Anzahl der ausgefüllten Zeilen, also 1 .. 6. Du bekommst aber die Anzahl der Elemente in $_POST. Das ist ein zweideimensionales Araay, du zählst die 1. Dimension.

    1. Du liest ein Feld mit Namen 'stueck' ein, das es in deinem Formular nicht gibt

      Das Feld stück wird vorher ausgewählt und wird dann für alle übergeben.

      Im Formular hast du sechs Felder mit demselben Namen name="nr" + vier arrays mit je 6 Namen

      Ich hab jetzt mal das <input type="hidden" name="nr"> entfernt, weil ich das ja auch sowieso nicht mit übergeben habe, und jetzt funktioniert das.

      Wenn du nun $anzahl = count($_POST); zählst, könnte das 10 ergeben, wobei ich nicht weiss, wie die verschiedenen Browser den Fehler mit den 6 nr interpretieren.

      Es hat da ja nie 10 ergeben, weil er das Input-Feld mit den 6 Nummern ja anscheinend nur einmal gezählt hat. Wäre es den sinnvoll, zum Beispiel $anzahl = count($_POST['vorname']) oder so zu nehmen? Dann würde man ja die zweite Dimension zählen und nicht mehr nur die erste, und dann müsste ja auch bei weniger als 6 Einträgen die richtige zahl raus kommen, oder?

      1. Ich hab jetzt mal das <input type="hidden" name="nr"> entfernt, weil ich das ja auch sowieso nicht mit übergeben habe, und jetzt funktioniert das.

        Gut.

        Wäre es den sinnvoll, zum Beispiel $anzahl = count($_POST['vorname']) oder so zu nehmen?

        Im Prinzip ja, hat aber einen Haken, wenn jemand auf die Idee kommt, eine Zeile auszulassen:

        $mist = array();
        $mist['vorname'] = array();
        $mist['vorname'][1] = "Hans";
        $mist['vorname'][2] = "Peter";
        $mist['vorname'][4] = "Paul";
        echo "Es wurden [".count($mist['vorname'])."] Vornamen eingetregen.<br>";
        echo "[".$mist['vorname'][2]."] ist der [2]. Vorname<br>";
        echo "[".$mist['vorname'][count($mist['vorname'])]."] ist der [".count($mist['vorname'])."]. Vorname<br>";
        

        Es gibt 3 Vornamen, aber den Vornamen mit dem Index 3 nicht. Gibt bei mir eine PHP-Fehlermeldung.

        Übrigens: Bei der Test-Ausgabe von Variablen umrahme ich die mit []. Dann kann man sofort sehen, wenn die leer sind.

        1. Im Prinzip ja, hat aber einen Haken, wenn jemand auf die Idee kommt, eine Zeile auszulassen:

          Ja gut, das kann natürlich passieren... Mal schauen wie ich das dann machen...

          Trotzdem Danke Danke Danke

          Gruß Franky

        2. Tach!

          Übrigens: Bei der Test-Ausgabe von Variablen umrahme ich die mit []. Dann kann man sofort sehen, wenn die leer sind.

          Deswegen var_dump() statt echo, weil var_dump() immer ein nicht leeres Ergebnis bringt und auch noch den Typ dazu anzeigt, während echo auch gern mal was umwandelt (wie true zu 1 und false zu Leerstring).

          dedlfix.

      2. Tach!

        Im Formular hast du sechs Felder mit demselben Namen name="nr" + vier arrays mit je 6 Namen Ich hab jetzt mal das <input type="hidden" name="nr"> entfernt, weil ich das ja auch sowieso nicht mit übergeben habe, und jetzt funktioniert das.

        Nein, das funktioniert nur scheinbar. Die 6, die nun entsteht ist nur zufällig genau die Zahl, die du grad eben haben möchtest. Bei mehr oder weniger Einträgen ist das wieder falsch.

        Wäre es den sinnvoll, zum Beispiel $anzahl = count($_POST['vorname']) oder so zu nehmen?

        Das wäre schon eher zielführend. Wenn immer alle Unter-Arrays gleich gefüllt sind. Das ist dann auch der springende Punkt, warum man bei solchen verschachtelten Arrays nicht in Dimensionen denken sollte. "Zweidimensional" bedeutet, dass es in beide Richtungen gleichmäßig vorangeht. Dein Array ist aber eher ein Baum. Ein solcher ist in der Natur nicht x-dimensional sondern kunterbunt verästelt. Arrays in PHP können als Elemente einfache Werte oder Arrays oder Objekte haben. Besonders wenn es sich um solche Datensatz-Arrays handelt. X-dimensional sollte man sie nur dann betrachten, wenn sie wirklich so sind, beispielsweise bei mathematischen Aufgabenstellungen. Und selbst dann sind sie es nur mit Disziplin, denn sie bleiben weiterhin PHP-Arrays, die beliebig gefüllt werden könnten.

        dedlfix.