Hallo Linuchs,
Wir diskutieren, aber es scheint keine Lösung für meine Freage zu geben.
So scheint es.
Du hast zwei Optionen:
- Du listest die Felder explizit auf, die vom INSERT zu befüllen sind, und listet dazu passend 1:1 die Werte auf
INSERT INTO foo (bar, baz, bing, bong) VALUES (1,2,3,4)
An Stelle von VALUES(1,2,3,4) kann auch ein SELECT stehen, der 4 Spalten liefert.
- Du listest die Felder NICHT auf, dann musst Du für jede Spalte einen Wert liefern. In der Reihenfolge, wie die Columns in der Table definiert sind. Dies ist eine Tretmine mit angerostetem Zünder und in einem Programm nur dann vertretbar, wenn Du die Werte mit einem SELECT * auf die gleiche Tabelle lieferst. Was aber wiederum in den allermeisten Fällen sinnfrei ist.
Deine einzufügende Datenmenge steht in einem Array? Wie wäre es denn dann, wenn Du dieses Array so aufbaust:
$row = [
"datum" => $datum,
"ort_id" => $ort_id,
"beschreibung" => $beschreibung,
"veranstalter" => $veranstalter
];
Für den INSERT kannst Du die Keys aus dem Array extrahieren und daraus die Spaltennamen ableiten. Im besten Fall ist das 1:1. Wenn deine internen Namen von den Column-Namen der Tabelle abweichen, brauchst Du noch eine Mapping-Tabelle, die aus den internen Keys die Column-Namen erzeugt.
$columns = [];
$values = [];
foreach ($row as $col => $val) {
$columns[] = $col;
$values = mysqli_real_escape_string($db, $val);
}
$columns = implode(",", $columns);
$values = implode(",", $values);
// oder
$values = "'" . implode("','", $values) . "'";
Weiß grad nicht ob Du die Anführungsstriche selbst erzeugen musst oder ob die aus der Escape-Funktion kommen. Je nach dem brauchst Du die obere oder untere der beiden Varianten.
Und dann kannst Du aus Spaltennamen und Werten das INSERT-Statement zusammenbauen:
INSERT INTO foo ($columns) VALUES ($values)
Sicherlich fehlt da noch einiges, so dass es in dein Gesamtkunstwerk hineinpasst, und man findet sicherlich auch Gelegenheiten, sich damit in den Fuß zu schießen, aber das wäre ein Ansatz für Flexibilität.
Rolf
sumpsi - posui - obstruxi