Heim >Datenbank >MySQL-Tutorial >Können vorbereitete Anweisungen dynamische Spaltennamen in SELECT-Abfragen verarbeiten?
Vorbereitete Anweisungen: Umgang mit dynamischen Spaltennamen in SELECT-Abfragen
Die Herausforderung:
Können vorbereitete Anweisungen dynamische Spaltennamen in SELECT
Abfragen berücksichtigen?
Szenario:
Ein Benutzer illustrierte ein MySQL- und Java-Beispiel:
<code class="language-java">String columnNames = "d,e,f"; // From user input String tableName = "some_table"; // From user input String query = "SELECT a,b,c,? FROM " + tableName + " WHERE d=?"; //...</code>
Das Ersetzen des Parameters durch die Zeichenfolge columnNames
führt zu:
<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
Das beabsichtigte Ergebnis ist jedoch:
<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
Lösung:
Die direkte Verwendung vorbereiteter Anweisungen für dynamische Spaltennamen ist nicht möglich. Vorbereitete Anweisungen parametrisieren Werte, keine Spaltenbezeichner.
Alternative Strategien:
Die effektivste Lösung ist die Änderung des Datenbankschemas. Anstatt Daten auf zahlreiche Spalten zu verteilen, führen Sie eine einzelne Spalte ein, die dynamisch benannte Spalten enthält. Diese Spalte würde eine serialisierte Zeichenfolge enthalten, die eine Liste von Spaltennamen für jede Zeile darstellt.
Dies erfordert eine strenge Eingabebereinigung, um SQL-Injection zu verhindern. Die Verwendung von String#replace()
als Escape-Anführungszeichen und die anschließende Verkettung der bereinigten Spaltennamen in die SQL-Abfragezeichenfolge ist eine praktikable Methode. Erwägen Sie die Verwendung parametrisierter Abfragen für andere Teile der Abfrage, um nach Möglichkeit Sicherheitsvorteile aufrechtzuerhalten.
Das obige ist der detaillierte Inhalt vonKönnen vorbereitete Anweisungen dynamische Spaltennamen in SELECT-Abfragen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!