Seite 1 von 1
Anführungzeichen in SQL command
Verfasst: Samstag 18. Juni 2022, 05:49
von Ernie1412
wie kriege ich " Zeichen im SQL command, wenn ein value ein ' enthält ?
Code: Alles auswählen
command="""INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (NULL,%s,%i,%s,%s,"%s");""" % (low,setting_id,logo,DateiOrdner,Beschreibung,)
ich habs mit f"INSERT ... versucht
ich habs mit "INSERT ....format(...) versucht
wenn ich das wie oben mache, bekomme ich als Ergebnis:
Code: Alles auswählen
'INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (NULL,startrek,1,background-image: url(:/Logos/grafics/StarTrek/startrek_90x40.png),Y:\\_Label\\StarTrek,"//div[@class=\'xz1bz0-0 bNiqBh\']/p");'
der macht vor dem ' Zeichen ein \ davor. ... class=
\'xz1bz0-0 bNiqBh
\']/p...
Beschreibung="//div[@class='xz1bz0-0 bNiqBh']/p"
Keine Ahnung warum, wieso ;(
Welche Möglichkeiten gibts denn noch, um beides " und ' zu adden ?
Re: Anführungzeichen in SQL command
Verfasst: Samstag 18. Juni 2022, 06:10
von sparrow
Man baut keine Values per Stringformatierung in ein SQL-Statement. Niemals. Das ist nicht nur in diesem Fall ärgerlich, das ist vor allem ein riesiges Sicherheitsproblem. Wenn du Usereingaben in SQL-Statements zulässt, steht dem Benutzer damit die Datenbank offen. Stichwort: SQL Injektion.
Erster Anlautpunkt, sollte immer die Dokumentation sein. Und wenn du dir die anschaust, findest du auch, wie man Values in sqlite3 Statements verwendet.
Code: Alles auswählen
statement = "INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (?, ?, ?, ?, ?, ?);"
cursor.execute(statement, (None, low, setting_id, logo, datei_ordner, beschreibung))
Ich war so frei und habe gleich die falsch geschrieben Namen angepasst. Namen werden in Python klein_mit_unterstrich geschrieben. Außer Klassen (PascalCase) und Konstanten (KOMPLETT_GROSS).
Bitte verwende SQL Statements immer so. Und ein Blick in die Dokumentation ist zumindest nie hinderlich.
Re: Anführungzeichen in SQL command
Verfasst: Samstag 18. Juni 2022, 08:09
von __blackjack__
Ich würde das mit den Namen auch noch auf die Namen in der Datenbank erweitern, denn SQL unterscheidet nicht zwischen Gross- und Kleinschreibung, und Datenbanken dürfen dementsprechend Namen auch normalisieren und beispielsweise `ArtistID` als `ARTISTID` oder `artistid` anzeigen. Und da ist `ARTIST_ID` oder `artist_id` leichter lesbar, weil man nicht im Kopf anfangen muss die Wortgrenze(n) zu finden.
Re: Anführungzeichen in SQL command
Verfasst: Samstag 18. Juni 2022, 10:01
von Ernie1412
ich benutze QtSQL und SQLite
habs nun mit query.bindValue() hinbekommen.
Re: Anführungzeichen in SQL command
Verfasst: Freitag 22. August 2025, 11:34
von DeaD_EyE
Genau aus solchen Gründen sind Template-Strings eingeführt worden. Der Syntax ist gleich wie bei den f-strings, aber der Unterschied ist, dass man Template-Strings zuvor interpolieren muss. Eine Funktion, die dann z.B. speziell fürs Escapen zuständig ist, übernimmt dann diese Aufgabe. Am Ende wird ein normaler str ausgegeben.
Ist noch ziemlich neu und wahrscheinlich gibt es bis jetzt noch nicht viele Bibliotheken, die das unterstützen.
Cool wäre es z.B. wenn sqlite3 eine Funktion für Template-Strings bereit stellt.
Bis jetzt würde ich aber den klassischen Weg gehen und SQL-Statement getrennt von Daten behandeln. Deswegen kann man execute 2 Argumente übergeben. Das erste Artgument ist das SQL-Statement ohne Daten und das zweite Argument sind die Daten. Das zweite Argument, also die Daten, werden automatisch Escaped. Das ist also sicher.
Re: Anführungzeichen in SQL command
Verfasst: Montag 6. Oktober 2025, 18:20
von oldboyJR
$sql = "INSERT INTO petitionmg (Anrede, Vorname, Nachname, Email, Strasse, Nummer, Ort, PLZ, Bundesland, Kommentare, Unterstuetzer )
VALUES ('" .$Anrede ."', '" .$Vorname ."','" .$Nachname ."', '" .$Email ."', '" .$Strasse ."','" .$Nummer ."', '" .$Ort ."', '" .$PLZ ."', '" .$Bundesland ."', '" .$Kommentare ."', '" .$Unterstuetzer ."' )";
Re: Anführungzeichen in SQL command
Verfasst: Montag 6. Oktober 2025, 18:47
von sparrow
@oldboyJR: Was genau ist der Sinn, dass du hier alte Threads ausgräbst und mit fragwürdigen Posts ergänzt? Oder wo ist hier der Bezug zu Windows?
Re: Anführungzeichen in SQL command
Verfasst: Montag 6. Oktober 2025, 19:11
von __blackjack__
@oldboyJR: Das ist keine Python-Syntax und man bastelt in keiner Sprache SQL-Anweisungen als Zeichenkette mit Werten zusammen, wenn man nicht möchte dass da SQL-Injection passieren kann.
Re: Anführungzeichen in SQL command
Verfasst: Dienstag 7. Oktober 2025, 09:20
von oldboyJR
Sorry ist das nicht Systemunabhängig? Mysql ist doch eine opensoftware Server lösung die sowohl in einem Internen server wie xampp als auch unter externen Server installiert werden kann und ein und die selbe Sequenz braucht? Sonst würde doch die systenübergreifende Eigenschaften fehlen. Ist es nicht erforderlich das in dem Programm die SQL-Injection durch überprüfungen ausgeschlossen werden oder ist das eine naive und unnötige Einstellung? Natürlich habe ich nicht daran gedacht das unterschiedliche Treiber andere Sequenzen brauchen oder? Ist ein neues System nicht mit einer neuen ID verbunden die dann ein falschen Hasch erzeugt? Sowie ein anderer Browser, Benutzernummer auch eine Fehlermeldung erzeugt wenn man die selbe Bank aufruft? Also muß man dann doch noch fragen welchen Treiber in welcher Version usw. ? Bevor wir alle spekulieren was falsch ist. Unter PHP und Java sind die Anforderungen die selben! Erfolglose Sequenzen sind abhängig vom Treiber und Versionsnummer sowie es Probleme gibt, wenn man eine neue Python Version nimmt, bei denen die Module auf den neusten Stand gebracht hat und sich Syntax verändern.
Re: Anführungzeichen in SQL command
Verfasst: Dienstag 7. Oktober 2025, 11:07
von sparrow
@oldboyJR: WIr brauchen überhaupt nicht spekulieren, weil das, was du hier zeigst, falsch ist. Egal in welcher Sprache. Das was du schreibst wirkt für mich alles sehr wirr und gar nicht passend.
Zur Klarstellung: SQL ist ein Standard, der definiert ist und den verschiedene Datenbanken unterschiedlich genau umsetzen.
In der Regel schickt man aber kein rohes SQL an die Datenbank. Eben um zum Beispiel SQL-Injections zu verhindern. In Python können die verwendeten Platzhalter unterschiedlich sein, deshalb sollte man in die Dokumentation schauen.
Wenn man da eine Abstraktion möchte, hilft unter Python der Einsatz von SQLAlchemy.
Zu deinem kaputten Beispiel weiter oben, das einfach ein SQL-Statement zusammenbaut: Keine Ahnung aus welcher Programmiersprache du das gefummelt hast, aber auch dort sollte man sicher nicht Statments einfach zusammensetzen. Wir nehmen an, dass wir mit einer MariaDB sprechen und schauen deshalb in die
Dokumentation, orientieren uns daran und schreiben dann das Statement richtig:
Code: Alles auswählen
sql = (
"INSERT INTO petitionmg "
"(Anrede, Vorname, Nachname, Email, Strasse, Nummer, Ort, PLZ, Bundesland, Kommentare, Unterstuetzer) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
)
cur.execute(
sql,
(anrede, vorname, nachname, email, strasse, nummer, ort, plz, bundesland, kommentare, unterstuetzer)
)
Das steht auch alles schon in diesem Thread. Zumindest ich verstehe nicht, warum du dann etwas, das mit Python so gar nichts zu tun hat, hinzugefügt hast.
Ich vermute auch, dass du die Relationen in der Datenbank falsch umgesetzt hast und es keine Normalisierung gibt. Die Namen "Kommentare" und "Unterstuetzer" sind in Mehrzahl, was darauf hindeutet, dass es mehrere davon für einen Eintrag gibt. Dann gehören die nicht alle in ein Feld sondern in entsprechend veknüpfte Tabellen.