Eintragen von Datensätzen beschleunigen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
code
datum
echt nett blicke
eintragen
einzelne koordinate
erfolgreich eingetragen code
fenster
folgende meldungen
folgendem code
grad
header
lageplan
minute
null
program files
sammeln
schleife
test
url
-
Hallo zusammen,
ich habe vor, ein Lageplan für ein Spiel zu programmieren und dafür will ich jede einzelne Koordinate in die Datenbank speichern. Ich hatte vor, das über PHP mit folgendem Code zu machen:
for($x=50; $x<=50; $x++){ for($y=1; $y<=25; $y++){ $insert = "INSERT INTO lageplan (id, x_koordinate, y_koordinate) VALUES ('NULL', '$x', '$y')"; if($ergebnis2 = $mysqli->query($insert)) { // Erfolgreich eingetragen } } }
Das funktioniert auch super. Nur ich habe gemerkt, dass es relativ lange dauert und mir gedacht, dass muss doch schneller gehen.
In meinem Fall sind es jetzt 2500 Einträge, was noch in Ordnung ist. Aber was ist, wenn man mehrere Hunderttausend Einträge automatisiert eintragen will? Wie geht das am besten? Würde mich über Hilfe freuen.
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Alle Einträge sammeln und am Ende EIN insert machen. VALUES können beliebig viele Datensätze, getrennt durch Komma sein.
INSERT INTO xyz (id, x, y)
VALUES
(1, 34985, 2905), (2, 3489, 390486), ... -
Aber so müsste ich doch alle Werte per Hand in das Insert schreiben oder nicht? Dann wäre es ja nicht mehr automatisiert. Oder komm ich grad nur nicht drauf wie deine Variante auch automatisiert gehen könnte?
-
Statt dem INSERT in der Schleife sammelst du alle in einem Array
$daten[] = "('NULL', '$x', '$y')";
Nach der Schleife verbindest du sie mit einem
$insert = implode (', ', $daten);
und hängst $insert nach VALUES an die Abfrage.
INSERT INTO lageplan (id, x_koordinate, y_koordinate) VALUES $insert
Beitrag zuletzt geändert: 1.4.2013 21:56:07 von chatter -
Mhhh könntest du mir das wohl in den Code von oben einbauenß Wäre echt nett. Blicke da grad noch nicht so durch.
-
Weil ich gerade ein paar Minuten Zeit habe:
$daten = array (); for($x=50; $x<=50; $x++){ for($y=1; $y<=25; $y++){ $daten[] = "('NULL', '$x', '$y')"; } } $daten = implode (', ', $daten); $insert = "INSERT INTO lageplan (id, x_koordinate, y_koordinate) VALUES ".$daten; if($ergebnis2 = $mysqli->query($insert)) { // Erfolgreich eingetragen }
Edit: Kleiner Syntaxfehler
Beitrag zuletzt geändert: 1.4.2013 22:07:38 von chatter -
Danke schön! Funktioniert echt viel viel schneller! Allerdings habe ich das grad mal zum Test mit 300.000 Datensätzen gemacht und dann kam folgender Fehler:
Warning: Error while sending QUERY packet. PID=9532 in C:\Program Files (x86)\EasyPHP-12.1\www\test\insert.php on line 36
Weißt jemand zufällig, was das zu sagen hat?
EDIT:
Und wenn ich die Zahl halbiere kommen folgende Meldungen:
Warning: mysqli::query(): MySQL server has gone away in C:\Program Files (x86)\EasyPHP-12.1\www\test\insert.php on line 36 Warning: mysqli::query(): Error reading result set's header in C:\Program Files (x86)\EasyPHP-12.1\www\test\insert.php on line 36
Beitrag zuletzt geändert: 1.4.2013 23:06:14 von ultimate-bravery -
300.000 wird im wohl zu viel auf einmal sein. Teil es doch ein bisschen auf, oder falls nur lokal, setz die Beschränkungen in der MySQL-config höher.
-
Welche Beschränkung wäre das denn genau in der Config?
-
ultimate-bravery schrieb:
oder probierst du so (in einem 'cmd'-fenster)
Welche Beschränkung wäre das denn genau in der Config?php -f 'C:\Program Files (x86)\EasyPHP-12.1\www\test\insert.php'
in dem fall hat php keine beschrenkungen unter unix/linux. wenn unter windows ist das auch so, dann hast du schon gewonnen ;)
==== EDIT ====
die beschränkungen können hauptanteilich 'laufzeitüberschreitung' o. 'maxdataüberschreitung' sein.
Beitrag zuletzt geändert: 2.4.2013 10:32:11 von czibere -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage