Zahlenfolge in DB eintragen

claireannelage

Grünschnabel
Ich habe ein Array mit einer Zahlenfolge (nicht fortlaufend) die ich in eine Tabelle eingeben möchte. Ich hatte mir das ganz einfach vorgestellt, einen Eintrag zu machen der so aussieht:
PHP:
$sqlab="insert into test (userid) values (";
foreach ($user as $value){
	$sqlab.= $value.",";
	}
$sqlab.="0)";
Erzeugt genau die Abfrage die ich wollte
insert into test (userid) values (1,2,3,4,5,6,73,76,77,78...) (gekürzt)

Neben dem Feld exisitert noch ein weiteres Feld id das automatisch hochzählt.
Diese Abfrage erzeugt eine Fehlermeldung. Wie kann ich sie umschreiben dass das Problem nicht mehr auftritt ?
 
Hi,

welche Fehlermeldung? Wie sieht die Tabellenstruktur aus?
So wie ich das sehe, hat deine Tabelle nur ein Feld und du versucht mehrere Felder zu schreiben ;)

Gruß
BK
 
Warum machst du nicht die ganz Abfrage in der Schleife?

Trägt jeden Wert aus $value in die DB ein:
PHP:
foreach ($user as $value){ 
  $sqlab="insert into test (userid) values ($value)"; 
  mysql_query($sqlab) or die mysql_error()."\nQuery war: #".$sqlab."#\n"); 
   }
 
Hi,

von einer mysql_query()-Schleife würde ich abraten, das ist von der Performance her so ziemlich das schlechteste was du machen kannst.

Hab mal fix ne Idee, keine Ahnung ob das so passt:
PHP:
$sqlab='insert into test (userid) values ';
foreach ($user as $value) {
    $sqlab.= '(' . $value . '),';
}
$sqlab.='(0)';

Gruß
BK
 
Bratkortoffels Lösung ist Richtig. Der INSERT-Befehl für mehrere Rows lautet
SQL:
--Insert für die IDs 1-4
INSERT INTO test (userid) VALUES (1),(2,)(3),(4);

Das 0 am Schluss macht irgendwie wenig Sinn. Ich habs darum mal ohn umgesetzt
PHP:
$values = array()
foreach ($user as $value){ $values[]= "({$value})"; }
$sqlab.='insert into test (userid) values '.implode(',', $values);
 
Zuletzt bearbeitet von einem Moderator:
ah ja - genau das hab ich gesucht (ich hab seit über einem Jahr nichts mehr gemacht und musste feststellen dass selbst die einfachsten Sachen nicht mehr klappen - vielen Dank !

Die Null am Ende hab ich gemacht da es das erste war was mir einfiel um kein , hinter dem letzten Wert zu haben - und der . vor dem $sqlab musste auch weg - aber nun klappts :)
 
Die Variante von Bratkartoffel sollte so funktionieren. Zur Erklärung warum:
In deinem Code, claireannelage, erstellst du eine Query, welche alle Zahlenwerte in einen einzigen Datensatz eintragen will/soll (was einer Tabelle entsprechend müsste die so viele Spalten wie Werte in $user hat). Jeder Datensatz hat bei dir aber genau einen Wert userid, daher musst du MySQL auch mitteilen, dass jeder Zahlenwert ein eigener Datensatz ist. Dies erreichst du durch eine Folge von "(wert_1, wert_2, ...)", welche durch ein Komma getrennt werden müssen.
 
Jeder Datensatz hat bei dir aber genau einen Wert userid, daher musst du MySQL auch mitteilen, dass jeder Zahlenwert ein eigener Datensatz ist. Dies erreichst du durch eine Folge von "(wert_1, wert_2, ...)", welche durch ein Komma getrennt werden müssen.

Falsch.
In der Klammer mit Kommas getrennt sind die Werte für die verschiedenen Felder in einer Zeile. Klammern mit Kommas getrennt sind verschiedene Zeilen. Ergo geht "(wert_1, wert_2, ...)" nicht um wert_1 und wert_2 je als Datensatz anzulegen. Es erzeugt den Fehler

SQL Error (1136): Column count doesn't match value count

So ist der Aufbau für ein INSERT mit 2 Zeilen und 3 Spalten

SQL:
INSERT INTO mytable (feld_a, feld_b, feld_c)
VALUES ('value_1_a', 'value_1_b', 'value_1_c'), ('value_2_a', 'value_2_b', 'value_2_c')
 
Zuletzt bearbeitet von einem Moderator:
Ich seh jetzt erst, dass ich irgenwie mit meiner Antwort 30min zu spät war o.O

@yaslaw: Und nichts anderes hab ich gesagt: Eine Folge von solchen Tupeln, welche durch ein Komma getrennt werden. ;)

Aber hat sich ja erledigt.
 
Zurück