Das Problem mit der Verwendung des Ordinalwerts für einen Spaltenverweis ist es (ich glaube) der Ordinalwert zum Zeitpunkt der SQL-Anweisung "Tabelle erstellen" wurde ausgeführt - so wie Sie Spalten zur Datenbanktabelle im Laufe der Zeit hinzufügen, kann das GUI-Tool, das Sie verwenden, um die Spalten anzuzeigen, nicht seinen tatsächlichen Ordinalwert darstellen. ich würde wirklich bleiben weg von mit cfqueryparam für diese.
Ich mag die Idee, eine Zahl in den Anfragevariablen (url, Form) zu verwenden, um anzugeben, welche Spalte zu sortieren, und dann verwenden Sie, dass in den Schalter und übersetzen Sie es in einen tatsächlichen Spaltennamen - so dass Sie nicht Ihre Spaltennamen an den Benutzer aussetzen.
Was die Frage angeht, wann/warum man cfqueryparam verwenden sollte, so sollte man bedenken, dass es NICHT nur um die Eingabevalidierung und das Verhindern von SQL-Injektionen geht (obwohl das ein sehr netter Bonus ist) - mit cfqueryparam wird die zugrunde liegende SQL-Anweisung an die Datenbank über den Treiber zurückgesendet, wobei SQL-Bind-Variablen verwendet werden - Platzhalterwerte, so dass der Datenbank-Optimierer bestimmen kann, welcher Index in einem allgemeineren Format verwendet werden soll... wenn Sie also eine SQL-Anweisung wie diese senden: SELECT * FROM product WHERE ID=1 und SELECT * FROM product WHERE ID=2 läuft der Optimierer beide Male. Aber mit Bindungsvariablen sieht die SQL-Anweisung so aus: SELECT * FROM product WHERE ID=? (?=1) und SELECT * FROM produkt WHERE ID=? (?=2), so dass der Optimierer die zwischengespeicherten Ergebnisse der ersten Analyse verwenden kann, um genau zu wissen, welcher Index bei der zweiten Abfrage zu verwenden ist. Je nach Komplexität der SQL und der Datenbank kann dies eine enorme Zeitersparnis bedeuten. meiner Erfahrung nach ist dies bei Oracle und Datums-/Zeitspalten in der Where-Klausel leistungsmäßig sehr hilfreich.
so weit, wo cfqueryparam zu verwenden, seine, wo eine SQL-Bind-Variable verwendet werden kann ...
hth jon