cfquery Problem mit komplexen Update-Anweisungen
-
21-09-2019 - |
Frage
Ich versuche, Feuer Aktualisierungsabfrage mit cfquery wie unter
<cfquery name = "UpdateRecord"
dataSource = #DATASOURCE#
username = #DBUSER#
password = #DBPASSWORD#
result="updateResult" >
update table1
set field1=( select field1 from table2 where field3='Some Value')
where field4='someothervalue'
</cfquery>
<cfdump var="#UpdateResult#">
Aber, wenn ich diese Seite ausführen, wird die Seite nicht laden, in der Statusleiste ich seine Lade für lange Zeit sehen kann.
Aber wenn ich jede einfache Aktualisierungsabfrage wie
update table1 set field1='abc' where field4='someothervalue'
dann ist es gut funktioniert
Kann irgend jemand Ahnung hat, wie kann ich die Abfragen wie oben mit cfquery ausführen?
Danke
Lösung
Haben Sie versucht, das Update innerhalb PreserveSingleQuotes Einwickeln?
<cfquery name = "UpdateRecord"
dataSource = #DATASOURCE#
username = #DBUSER#
password = #DBPASSWORD#
result="updateResult" >
#PreserveSingleQuotes(update table1 set field1=( select field1 from
table2 where Field3='Some Value') where field4='someothervalue')#
</cfquery>
Andere Tipps
Wenn Sie versuchen können, cfqueryparam für Ihre Werte mit und Sie werden nicht zu verwenden PreserveSingleQuotes haben. Es schützt auch vor SQL-Injection.
Sind Sie sicher, Ihre subselect Anweisung zurückgibt 1 Zeile. Es hängt davon ab, was RDMS Sie laufen lassen, aber ich bin mir ziemlich sicher, dass nicht alle Datenbanken unterstützen diese Funktion. Ich würde versuchen, die Abfrage direkt auf der Datenbank ausgeführt wird zuerst zu sehen, ob es korrekt ausgeführt wird.
Möglicherweise können Sie SQL zwingen, nur 1 Zeile zurückzugeben, indem eine Grenze 1 am Ende der Abfrage setzen, oder wenn Ihre Datenbank nicht unterstützt field1 in einem Aggregate gewickelt wird.
SELECT MAX(field1) FROM table2 WHERE field3 = 'Some Value'
. Hinweis: Wenn Sie Ihre String-Werte Parameter vom Benutzer sind, sollten Sie auf die Verwendung cfqueryparam stellen Sie sicher vor SQL-Injection zu schützen