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?
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.Antworten:
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:
Bei Verwendung erhalten
db_query()
Sie nur eine Parameterersetzung, die nur für Ersetzungen inWHERE
Bedingungen gelten würde. Dies bedeutet, dass Siedb_query()
Tabellennamen, die Namen der ausgewählten Felder usw. nicht nur durchWHERE
Bedingungen ersetzen können.In den
db_select()
Dokumenten finden Sie ausführlichere Beispiele, einschließlich des Hinzufügens von Bedingungen zur dynamischen Abfrage.quelle