2016-05-06 5 views
0

PräambelGebäude Variablen während eines Objekts Schleife zum Abrufen von Daten aus bereits existierenden Variablen

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 ...

+0

Wussten Sie, ** Sie sind auch mit Back-Ticks '' für Spaltenwerte **? Vielleicht möchten Sie testen, was ich unten gepostet habe ... – Poiz

Antwort

1

Ich glaube sicher nicht Sie Ihr Gelübde gebrochen haben muss DRY wenn du es getan hast, wie so:

<?php 

     // 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) { 
      $tblVal = ($tv=$d->COLUMN_NAME)? "`" . $tv . "`, " : $sql; 
      $sql .= $tblVal; 
     } 

     $sql = trimSQL($sql); // Removes the final ', ' 
     $sql .= ') VALUES ('; 

     // This is the problem loop. 
     foreach($data as $d) { 
      $colVal = ($cn=$d->COLUMN_NAME)? "'" . $$cn . "', " : $sql; 
      $sql .= $colVal; 
     } 

     $sql = trimSQL($sql); // Removes the final ', ' 
     $sql .= ')'; 

     return $sql; 
+0

Ausgezeichnet, danke! –

0

Das Problem für den Einsatz ist, dass Sie ` anstelle von ' (einfaches Anführungszeichen), um die Werte zu umbrechen. Das Ergebnis für die Spaltenauswahl ist ein einzelnes Array mit allen Spalten der angegebenen Tabelle.

Ihren Code ändern:

foreach($data as $columnName) { 
    $sql .= "'" . ${$columnName} . "', "; 
} 
+0

Danke - Sie haben Recht, das ist ein Problem, aber es ist nicht * das * Problem zu beheben. Jetzt bekomme ich '('', '', '')' –

+0

Sie sollten überprüfen, ob Ihre erste Abfrage die Spaltennamen korrekt zurückgibt. Im Fall der Aktualisierung verwenden Sie die Spalte aus der Auswahl einer Zeile, aber in der Abfrage einfügen die Auswahl ist anders ..nur var_dump $ Daten, um zu sehen, was es enthält –

Verwandte Themen