Flask mit SQL-Anbindung, Problem mit Update-Befehl

Django, Flask, Bottle, WSGI, CGI…
Antworten
dasas1112
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 10:48

Hallo bin ganz neu hier im Forum und noch relativ unerfahren mit der ganzen Thematik.
Ich hänge momentan an einem simplem SQL Update Befehl fest.
Nur zur Situation:
Ich bekomme 3 Werte aus einem HTML Formular. (1 Wert: Zeilenname, 2 Wert: Spaltenname, 3 Wert: Neuer Wert im Feld).
Habe nun versucht alle 3 Werte in den Update Befehl einzubauen, jedoch muss ich hierfür %s = %s im Update Befehl schreiben dies nimmt SQL aber nicht an.
Ein Kumpel meinte ich muss mit ner String Formatierung arbeiten aber wo und wie habe ich nicht kapiert.
Ich hoffe ihr könnt mir weiter helfen.

Code:
cursor.execute('update Autos set %s=%s where ID=%s ' , (eing_datum, eing_neuer_wert, auto_id,))
Fehler:
1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Automarke'='ss' where ID=1' at line 1

MFG
dasas1112
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst in SQL nicht dynamisch eine Spalte per Parameter angeben. Das ist nur fuer Werte moeglich. Du musst das SQL also abhaengig von der Spalte aendern. Gleichzeitig musst du bei einem solchen Design hoellisch aufpassen, dass die Eingabe aus dem HTML-Formular nicht ungeprueft uebernommen wird, denn sonst wird dir per SQL-Injection beliebig in der DB rumgefuhrwerkt.

Ein Weg waere zB die SQL-Statements per dictionary vorzuhalten, so das nur erlaubte Werte gueltiges SQL liefern;

Code: Alles auswählen

STATEMENTS = dict(
       reifenanzahl="UPDATE auto SET reifenanzahl=%s",
       ps="UPDATE auto SET ps=%s",
       ...)
cursor.execute(STATEMENTS[spalte], (eing_neuer_wert, auto_id,))
dasas1112
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 10:48

Vielen Dank für die schnelle und hilfreiche Antwort.

Den Punkt mit dem ungewollten Zugriff Fremder hatte ich mir schon überlegt, jedoch keine Lösung.
Erstelle jetzt mal für alle Columns ein dictionary.
Den execute Befehl habe ich noch nicht ganz verstanden, hier bräuchte ich nochmal Hilfe.
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heisst nicht verstanden? Alles was da passiert ist, dass der SQL String nachgeschlagen wird. Sonst ist der doch gleich.
dasas1112
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 10:48

Sehr geil, funktioniert nun alles.
Stand so ewig auf der Leitung und es war so ne simple Lösung.

Vielen Dank
Zuletzt geändert von dasas1112 am Donnerstag 13. Juni 2019, 12:30, insgesamt 1-mal geändert.
dasas1112
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 10:48

Funktioniert nun leider nur für den ersten Spaltenname im Dictionary, bei allen weiteren kommt ne Fehlermeldung.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du jetzt programmiert? Zeig den Code und die komplette Fehlermeldung.
Antworten