Wie wähle ich eine Tabelle mit einer Variablen mit db_query () aus?


7

Ich versuche, Datensätze aus einer Tabelle zu finden, die auf einer Variablen basieren, die aus der Benutzerübermittlung abgerufen wird. Das ist meine Frage:

$field = t('field_data_' . variable_get('tabbed_content_field'));
$fieldValue = t(variable_get('tabbed_content_field') . '_value');
$query = db_query('SELECT :fieldValue FROM {:field}', array(':field' => $field, ':fieldValue' => $fieldValue));

Wenn ich diese Abfrage ausführe, wird jedoch die folgende Fehlermeldung angezeigt:

PDOException: SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von '' field_data_field_news_release_date '' in Zeile 2: SELECT: fieldValue FROM {: field}; Array ([: field] => field_data_field_news_release_date [: fieldValue] => field_news_release_date_value)

Ich kann die Datensätze erfolgreich abrufen mit:

$query = db_query('SELECT ' . $fieldValue . ' FROM { ' . $field . '}');

Nach meinem Verständnis wäre dies jedoch unsicher.

Weiß jemand, warum die erste Abfrage nicht funktioniert?


2
Als Randnotiz verwenden Sie nicht t()für Zeichenfolgen, die nicht übersetzt werden müssen. Der Name einer Datenbanktabelle oder eines Datenbankfelds muss nicht übersetzt werden. Die Tabelle "Knoten" ist immer die Tabelle "Knoten", unabhängig von der Sprache, die derzeit für die Site aktiviert ist.
Kiamlaluno

@kiamlaluno ah richtig danke dafür.
Stephen Young

Antworten:


6

Dies ist einer der Gründe, warum der neue Abfrage-Generator in Drupal 7 vorhanden ist, sodass Sie Teile der Abfrage dynamisch ersetzen können:

$table_name = 'the_table';
$field_name = 'a_field';
$query = db_select($table_name)->fields($table_name, array($field_name));

Bei Verwendung erhalten db_query()Sie nur eine Parameterersetzung, die nur für Ersetzungen in WHEREBedingungen gelten würde. Dies bedeutet, dass Sie db_query()Tabellennamen, die Namen der ausgewählten Felder usw. nicht nur durch WHEREBedingungen ersetzen können.

In den db_select()Dokumenten finden Sie ausführlichere Beispiele, einschließlich des Hinzufügens von Bedingungen zur dynamischen Abfrage.


Vielen Dank Clive - das hat bei mir funktioniert. Bereinigt die Funktion db_select automatisch potenziell böswillige Dateneingaben?
Stephen Young

1
@StephenYoung Die Drupal-Datenbankebene ist im Wesentlichen ein Wrapper um PDO, sodass Sie die gesamte parametrisierte Abfragegüte direkt einbauen können. Die einzige Möglichkeit, sie unsicher zu verwenden, ist wie das zweite Beispiel in Ihrer Frage, das, wie Sie zu Recht gesagt haben möglicherweise offen für Exploit sein.
Clive

@StephenYoung An die Datenbank-API übergebene Daten werden bereinigt.
Kiamlaluno
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.