Entwickler-Ecke
Datenbanken - String "escapen"
matze - So 05.03.06 10:32
ja die artikel sind ja schön und nett, aber ich weiß nun immer noch nicht, wie ich das in Delphi machen kann !
digi_c - Di 07.03.06 12:03
Ich habe das mal bei mir ausprobiert, weil ich befürchtet hatte, das man die Filter manipulieren könnte. Ich konnte das nicht manipulieren indem ich "; SELECT..." miteingegeben hab. Ich render auch nur lokale Datenbestände mit MatchesMask(...)
delfiphan - Di 07.03.06 19:58
Du setzst in deinen String-Variablen für die Queries einfach ein Backslash vor folgende Zeichen:
'
"
#0
#10
#13
#26
\
Das heisst, du ersetzst z.B. ' durch \' in deinem String.
Ohne Garantie auf Korrektheit, bitte zuerst selbst testen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function AddSlashes(const S: String): String; const EscapeChars = [#0,#26,#10,#13,'\','''','"']; var I, Size, L: Integer; R, W: PChar; begin R := PChar(S); if R=nil then exit; L := Length(S); Size := 0; for I := L downto 1 do begin if R^ in EscapeChars then inc(Size, 2) else inc(Size); inc(R); end; SetLength(Result, Size); R := PChar(S); W := PChar(Result); for I := L downto 1 do begin if R^ in EscapeChars then begin W^ := '\'; inc(W); end; W^ := R^; inc(R); inc(W); end; end; |
matze - Mi 08.03.06 10:37
Wow danke für deine Funktion !
Ich habe mich in der Zeit auch mal schlau gemacht.
Die Zeichen die du maskierst sind laut dem MySQL Manual nicht alle, aber die kann man ja einfach nachrüsten.
http://dev.mysql.com/doc/refman/5.0/en/string-syntax.html
Ich werde die Funktion demnächst mal testen.
Vielen Dank nochmal.
digi_c - Mi 08.03.06 14:24
Ich versteh leider nicht so wirklich, welche Auswirkungen die Slashes haben sollen :( oder reden wir von zwei verschiedenen Sachen?
Postman - Di 31.07.07 16:52
Um das Thema nochmal aufzugreifen:
Hab die Funktion von delfiphan mal bei mir eingebaut und bekomme jetzt nen MySQL Fehler gemeldet wenn ich sie in Kombination mit " benutze. Hat sich da irgendwas geändert? Benutze MySQL 5.0.32
SQL-Anweisung
1:
| 'SELECT * FROM `test` WHERE User LIKE "%'+User+'%" AND Adresse LIKE "%'+Adresse+'%" ORDER BY User' |
delfiphan - Di 31.07.07 17:16
Wenn du die DLLs von MySql verwendest und einen vollständigen Delphi Header hast, dann sollte die Funktion mysql_real_escape_string (oder ähnlich) existieren. Ich empfehle dir, diese offizielle Funktion zum Escapen zu verwenden.
Postman - Di 31.07.07 17:31
Hm ich verwende MyDac um auf die Datenbank zuzugreifen, keine Ahnung ob man da eine solche Funktion aufrufen kann oder ob sie eh schon in der Komponente integriert ist.
delfiphan - Do 02.08.07 19:18
Die saubere Variante wäre es aber, mit Parametern zu arbeitern.
SQL-Anweisung
1:
| 'SELECT * FROM `test` WHERE User LIKE :User AND Adresse LIKE :Adresse ORDER BY User' |
Danach Parameter :User und :Adresse setzen. Wie bzw. ob das mit MyDac geht, weiss ich nicht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!