Ich baue eine neue Anwendung von Grund auf und ich versuche, das DRY-Prinzip, so viel wie möglich umzusetzen.
Ich versuche, meine Abfrage etwas dynamischer zu gestalten, also muss ich Variablen on-the-fly definieren, indem ich die Spaltennamen aus der Datenbanktabelle verwende, mit der ich gerade arbeite.
Das Problem
die Variablen im Fluge definieren arbeitet nur für die Hälfte meines Codes. Zum Beispiel wird der UPDATE
Code adaequat:
// Get the data.
$data = db::getInstance()->query("SELECT * FROM `{$table}` WHERE `ID` = {$id}")->firstResult();
// Build the SQL.
$sql = "UPDATE `{$table}` SET ";
foreach($data as $key => $value) {
$sql .= "`$key` = '{${$key}}', ";
}
$sql = trimSQL($sql); // Removes the final ', '
$sql .= "WHERE `id` = {$id}";
jedoch die INSERT
Code nicht:
// Get the column names from the DB.
$data = db::getInstance()->query("SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_NAME` = '{$table}'")->results();
// Build the SQL.
$sql = "INSERT INTO `{$table}` (";
foreach($data as $d) {
$sql .= ($d->COLUMN_NAME ? "'{$d->COLUMN_NAME}', " : $sql);
}
$sql = trimSQL($sql); // Removes the final ', '
$sql .= ') VALUES (';
// This is the problem loop.
foreach($data as $d) {
$sql .= ($d->COLUMN_NAME ? "`{${$d->COLUMN_NAME}}`, " : $sql);
}
$sql = trimSQL($sql); // Removes the final ', '
$sql .= ')';
return $sql;
Die oben kehrt die folgende:
INSERT INTO `table` (`col1`, `col2`, `col3`) VALUES (``, ``, ``)
So, die erste foreach
funktioniert wie erwartet, aber die zweite ist nicht.
Die Variablen, die ich definieren möchte, werden so dargestellt, als wären sie leer, wenn sie nicht vorhanden sind. Ich verwende die gleichen Formular- und Variablennamen wie die DB-Spaltennamen, damit ich den Prozess automatisieren kann.
Auch wenn ich die Variablen $col1
oben auf der Seite explizit definiert habe, werden die Daten immer noch nicht durchgezogen.
Das Konzept zum Hinzufügen/Bearbeiten ist praktisch gleich. Mit dem Hinzufügen von Daten haben wir jedoch nicht bereits die Tabellenstruktur und müssen auf eine andere Art und Weise darüber nachdenken.
Allerdings weiß ich, dass es keine Probleme mit DB gibt, da es die Spaltennamen für die erste Schleife wie erwartet ausspuckt.
Dies führt mich zu glauben, dass das Problem mit der Definition der Variablen on-the-fly von einem Objekt liegen muss, aber ich weiß nicht ...
Wussten Sie, ** Sie sind auch mit Back-Ticks '' für Spaltenwerte **? Vielleicht möchten Sie testen, was ich unten gepostet habe ... – Poiz