In Kohana 3 können Sie jetzt binden params in Abfragen genannt, aber wie ich entkommen, die ich nicht binden kann?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Frage

In Kohana 3, kann ich eine param in einer Abfrage wie so binden

$query = 'SELECT name FROM users WHERE id = :id';

Das ist nett, aber manchmal möchte ich andere Dinge konfigurierbar sein, wie der Tabellennamen. Wenn ich einen Namen param für Tabellennamen verwenden, scheitert es. Ich habe gerade die Zeichenfolge unter diesen Umständen baut.

Meine Frage ist, wie kann er möglicherweise schlechte Zeichen entkommen, wenn diese Art von String-Gebäuden zu tun? In Kohana 2.x, Sie könnten $this->db->escape() tun, aber da Kohana 3 radikal anders ist, würde ich vorstellen, dass es eine neue Art ist?

War es hilfreich?

Lösung

Nur um Mark Byers Antwort hinzuzufügen, ist der Grund, dass die Parametrisierung des Tabellennamen versagt ist, dass Parameter entkam als Werte , während ein Tabellenname ist eine Kennung . Was wohl passiert, ist, dass der Tabellenname in Anführungszeichen gesetzt wird, während es sollte stattdessen in Backticks gewickelt werden wird.

Doch wie Mark sagen, ein Bedürfnis Tabellennamen zu entkommen schlägt schlechtes Design. Sie sollten entweder hart in einigen Konfigurationsdatei, deren Inhalt codiert oder gespeichert werden vertraut werden kann sowieso nicht entkommen zu müssen. Der Versuch, alle Ihre Basen in einem solchen Ausmaß zu decken, die Sie Ihre eigene Konfiguration nicht trauen ist wahrscheinlich eine Verschwendung von Zeit.

Andere Tipps

Ich habe noch nie verwendet kohana, so entschuldigen, wenn dieser Kommentar völlig irrelevant ist, aber ich habe ein paar Bemerkungen über das, was Sie zu tun versuchen:

  

Wenn ich einen Namen param für Tabellennamen verwenden, scheitert es.

Ich gehe davon aus, dass dies, weil es auf die zugrunde liegende Datenbank Parameter Mechanismus setzt, und ich weiß nicht, jede Datenbank, die Sie einen Tabellennamen als Parameter in einer Abfrage geben kann. Also ja, wahrscheinlich werden Sie haben eine Zeichenfolge selbst zu bauen.

  

Wie kann ich möglicherweise schlechte Zeichen entkommen, wenn diese Art von String-Gebäuden zu tun?

Diese Frage scheint seltsam ... entweder Sie haben möglicherweise schlechte Zeichen in einigen Ihrer Tabellennamen ... wenn ja, warum? Oder aber ich empfangen Sie die Tabellennamen aus einem nicht vertrauenswürdiger Quelle (Benutzer?). Das klingt wie eine schlechte Idee zu mir. Was passiert, wenn sie versuchen, aus einer Tabelle zu lesen, sie haben nicht sollten Zugang? Wäre es nicht besser, eine gut definierte Liste der zulässigen Tabellennamen zu haben, und prüfen Sie, dass die Tabelle in dieser Liste vorhanden ist, anstelle von potentiell schlechten Tabellennamen zu entkommen?

Und ich habe eine letzte Bemerkung: Wenn Sie in der Lage sind die Tabellennamen in einer Abfrage zu ändern, und es funktioniert immer noch, das ist vielleicht ein Zeichen dafür, dass die Datenbank nicht korrekt normiert ist. Vielleicht könnten Sie Ihre Tabellen kombinieren und eine zusätzliche Spalte mit Informationen über die Gruppierung hinzufügen und eine WHERE-Klausel verwenden, um die Daten auszuwählen, die Sie wollen? Ich würde muß mehr über Ihr Modell wissen, etwas konkreter suggerieren.

Ich bin mir nicht sicher, ob dies überhaupt Ihre Frage beantworten hilft, aber diese waren meine Gedanken auf Ihre Frage zu lesen. Ich hoffe, Sie können einen Teil davon verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top