Ich stehe vor einem kleinen Problem. Ich arbeite gerade an einer Anwendung, die die Verwendung dynamischer Tabellennamen in MySQL erfordert.
Grundsätzlich habe ich eine Auswahl von Alben aus einer Datenbank basierend auf einer Reihe von Faktoren (Genre, Play Length, Veröffentlichungsdatum usw.) - Es gibt einen Abschnitt dieses Prozesses, der es dem Benutzer erlaubt, eine Menge von Custom zu erstellen Filter ..
Die benutzerdefinierten Filter geben eine Zählung an den Benutzer aller Alben innerhalb dieser Auswahlkriterien zurück. Die IDs dieser Alben werden dann in einer Tabelle mit einer zufällig generierten Hash- / Seriennummer gespeichert (z. B. albumSelect_20880f9c05d68a)
Ich habe es so gemacht, weil ich keine riesige Komma-getrennte Liste in einem Feld speichern wollte (wirklich albern) - und ich hatte keine Lust, ein Array von Werten an ein verstecktes Feld in meinem HTML zu senden würde nur den Datendurchsatz erhöhen (Könnte Tausende von Zeilen gleichzeitig sein)
In CodeIgniter verwende ich Query Bindings, um meine SQL-Abfragen wie folgt zu generieren:
%Vor%Die Abfrage wird dann automatisch maskiert, wenn ich die Abfrage
parametriere %Vor%Jetzt kommt der schwierige Teil
Wenn ich meine Abfrage so schreibe, dass sie so aussieht:
%Vor%Die resultierende Abfrage wird zu:
%Vor%Und zu Recht, aber offensichtlich ist die Abfrage dann ungültig ..
Bearbeiten: Weitere Informationen
Die Abfrage könnte Teil einer größeren Abfrage sein, abhängig davon, welche Kriterien der Benutzer auswählt. z.B.
%Vor%Ich habe mich nur gefragt, ob es einen Weg gibt, wie das funktioniert, ODER wenn jemand eine bessere Alternative vorschlagen könnte. Die Verkettung des Tabellennamens ist offensichtlich nicht eine Option.
Vielen Dank im Voraus!
Dave
Die Escaping-Mechanismen dienen nur für Datenstrings, nicht für Schemanamen. Mit anderen Worten, nur für den Inhalt einer Tabelle, nicht für seine Struktur . Sie müssen die Zeichenfolge entweder selbst in die Abfrage einfügen oder vermeiden, Tabellen auf diese Weise zu verwenden. Die ?
der Abfragevorlagen werden Ihnen dort nicht helfen.
Wenn Sie den String in den Tabellennamen einfügen, können Sie die üblichen PHP-String-Verkettungsmechanismen verwenden. Sie sollten extra sicher festlegen, dass Sie die Zeichenfolge anhand eines geeigneten strikten regulären Ausdrucks überprüfen, um eine SQL-Injektion zu vermeiden. Stellen Sie sicher, dass Sie wirklich nur eine zufällige Zeichenfolge des von Ihnen generierten Formats und nichts anderes einfügen.
Alternativ können Sie eine große Tabelle mit allen Auswahlen verwenden und eine zusätzliche Spalte verwenden, um Ihren Identifizierungshash zu halten, oder einen anderen geeigneten Schlüssel, um eine einzelne Auswahl zu identifizieren. Auf diese Weise müssten Sie das Datenbankschema während des normalen Betriebs nicht ändern. Ich glaube, die meisten Entwickler, mich eingeschlossen, würden solche Änderungen lieber durch Programmcode vermeiden. Guter Datenbankentwurf funktioniert mit einem festen Schema.
Es klingt für mich so, als ob Sie dynamisches SQL verwenden möchten. Sie müssen wahrscheinlich den Pfad von vorbereiteten Aussagen durchgehen >. Mit ihnen können Sie PREPARE
für die Zeichenfolge und anschließend EXECUTE
it aufrufen. Normale Verkettung funktioniert gut.
Damit können Sie Ihr SQL als String erstellen und ausführen. Wenn Sie die Parametrisierung von CodeIgniter in Kombination mit gespeicherten Prozeduren von MySQL verwenden, können Sie eine Abfrage wie "CALL selectAlbums(?, ?)"
aufrufen (vorausgesetzt, selectAlbums
ist die gespeicherte Prozedur, die die PREPARE
für die tatsächliche Abfrage enthält), die die Menge zurückgibt.
Wenn Sie die '
s in der Ausgabe loswerden wollen, kanalisieren Sie die Parameter über CONCAT
, wodurch eine normale Zeichenfolge erzeugt wird.
Tags und Links php mysql security activerecord codeigniter