Zum Inhalt springen

PHP: Mehrere inserts in einer Schleife


Empfohlene Beiträge

Sieht hier jemand vielleicht, wieso ich immer nur die erste POST-Serie in die DB krieg, aber die anderen 4 nicht?

Die inserts an sich gehen in der DB, hab ich schon getestet. Die Schleife läuft auch richtig durch, weil ich ja die Ausgaben bekomme.

<?php
session_start();
include('opendatabase.php');

//Kampf in Tabelle einfügen
for($i = 0; $i < 5; $i++) {
//Name in Vorname und Name zerlegen
$pos = strpos($_POST["schuetze".$i], " ");
$name = substr($_POST["schuetze".$i], 0, $pos);
$vorname = substr($_POST["schuetze".$i], $pos+1, strlen($_POST["schuetze".$i])-$pos);

//SchützenID aus DB holen
$result = mysql_query(sprintf(
"SELECT ID FROM Schuetze WHERE name=\"%s\" AND vorname=\"%s\"",
$name, $vorname));
$schuetzeID = mysql_fetch_array($result);

//Schütze in Ergebniss Tabelle eintragen
$query = sprintf(
"INSERT INTO Ergebnisse VALUES (LAST_INSERT_ID( ), \"%s\", \"%s\", \"%s\")",
$schuetzeID['ID'], $_POST['KampfID'], $_POST["s".$i."erg"]);

//DEBUG:
echo $query."<br>";
mysql_query($query);
}
echo '<b>Daten wurden gespeichert!</b>';

?> [/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich lasse mir ja unten nach dem

//DEBUG:

den komplett fertig zusammengebauten Query-String ausgeben, und der ist ja in Ordnung.

Wenn ich die Ausgabe aus dem Browser kopiere und in MySQL direkt einfüge, geht das ja auch.

Und der Code oben, stellt bei mir immer nur den INSERT im ersten Schleifen durchlauf in die DB, die nächsten aber nicht mehr.

Hab auch schonmal ne Pause (mit sleep(x)) eingebaut, weil ich dacht, die inserts kommen vielleicht zu schnell, aber das hat auch nichts gebracht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

*ratlosschaut

Also, mir kommen jetzt nur noch zwei Ideen:

1. Lass mal das LAST_INSERT_ID() weg und ersetze es durch eine 0. Hierbei gehe ich jedoch davon aus, dass du das entsprechende Feld mit auto_increment deklariert hast.

2. ersetze mal den zweiten mysql_query mit folgendem Aufruf:

mysql_query($query) or die(mysql_error() );

und schaue, ob er immer noch keine Fehlermeldung bringt

HTH

Benjamin

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie oft denn noch? :rolleyes:

Die SQL Statements die ich da zusammen baue, werden alle 5 korrekt ausgegeben, und ich kann auch alle 5 in der Datenbank einzeln ausführen! (per copy & paste)

@ kleiner Hobbes:

Das mit dem INSERT_LAST_ID() werd ich mal testen. Das Feld ist mit autoincrement declariert. Wenn ich die Seite öfter aufrufe, wird ja korrekt durchnummeriert, nur halt immer nur das erste Statement ausgeführt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem liegt hier ja auch bei LAST_INSERT_ID(). Beim ersten Mal funktionierts, weil noch keine ID zuvor eingefügt wurde. Jeder folgende Aufruf versucht nun, die zuletzt eingefügte ID als ID zu verwenden, was bei einem Primary Key zu Konflikten führt.

Davon abgesehen kannst du dir in PHP sprintf() sparen, da du die Variablen direkt in den String eintragen kannst:


$sql="INSERT INTO tabelle (feld1,feld2,feld3) VALUES('$feld1','$feld2','$feld3')"
[/PHP]

Des weiteren solltest du bei einem Insert immer die jeweiligen Felder (wie im Beispiel) angeben, damit du später bei einer Strukturänderung die Tabelle auch immer noch richtig füllst.

Wenn du das so machst, dann lass das Feld der ID weg und schon müssten alle 5 Abfragen (bzw Inserts) funktionieren.

Versuchs mal so:

[PHP]
<?php
session_start();
include('opendatabase.php');

for($i = 0; $i < 5; $i++) {
$pos = strpos($_POST["schuetze".$i], " ");
$name = substr($_POST["schuetze".$i], 0, $pos);
$vorname = substr( $_POST["schuetze".$i], $pos+1, strlen($_POST["schuetze".$i])-$pos);
$result = mysql_query("SELECT ID FROM Schuetze WHERE name='$name' AND vorname='$vorname'");
if ($result && mysql_num_rows($result)) {
list($schuetzeID)=mysql_fetch_row($result);
mysql_free_result($result);
$query = "INSERT INTO Ergebnisse (schuetzeID, KampfID, Ergebnis) VALUES ('$schuetzeID[ID]', '$_POST[KampfID]', '$_POST[s{$i}erg]')";
mysql_query($query);
}
echo $query."<br>";
echo mysql_error(),'<br/>';
}
echo '<b>Daten wurden gespeichert!</b>';
?>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...