[Delphi] Single quote probleem in een sql-string

Pagina: 1
Acties:
  • 271 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Ik heb een probleem met quotes in strings. Ik ben namelijk bezig met een delphi 4 applicatie dat op een mysql database draait. Nu heb ik daar van die handige componenten voor gevonden, namelijk Zeos components. Ik maak mijn sql statements op runtime, dus als ik een insert in een tabel doe, dan maak ik op runtime het sql statement aan. Dit werkt allemaal goed, behalve als de invoer een enkele quote bevat. Ik haal mijn invoer uit edit-velden en zet er dan zelf dan enekele quotes om heen, dus bijvoorbeeld:

Invoer gebruiker : Jan
Met quotes : 'Jan'
Statement : insert into klanten values('Jan')

Dit werkt allemaal behalve dus als de gebruiker een naam zou ingeven met een ', want dan kapt delphi daar de string al af en wordt het statement dus niet opgebouwd :/

Invoer gebruiker : Jan's
Met quotes : 'Jan's'
Statement : insert into klanten values('Jan's') -> dit gaat uiteraard niet goed

Heb al eens gezocht her en der, maar heb helaas nog nix gevonden :'(

Wie helpt mij ??

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 13:35

mulder

ik spuug op het trottoir

Je moet die string 'escapen' maar ik kan me even niet voor de geest halen hoe dat in Delphi ging. Effe Googlen dus.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

" gebruiken in de sql ipv '

We adore chaos because we like to restore order - M.C. Escher


Acties:
  • 0 Henk 'm!

  • scorpie
  • Registratie: Augustus 2001
  • Laatst online: 10:22

scorpie

Supra Addict

Invoer gebruiker : Jan's
Met quotes : 'Jan's'
Statement : insert into klanten values("Jan's") -> dit gaat uiteraard niet goed

werkt dit dan niet met dubbele quotes?

wil een Toyota Supra mkIV!!!!! | wil een Yamaha YZF-R{1,6} | wil stiekem ook een Ducati
"Security is just a state of mind"
PSN: scorpie | Diablo 3: scorpie#2470


Acties:
  • 0 Henk 'm!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

of 'Jan''s' van maken

We adore chaos because we like to restore order - M.C. Escher


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-04 23:14
Misschien kun je de QuotedStr() functie eens bekijken.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 25-04 19:12

Varienaja

Wie dit leest is gek.

Volgens mij is dat het probleem niet. Als je "Jan's" in een string S hebt zitten, dan kan je nog steeds een SQL-string 'insert into bla values (''' + S + ''')' maken.

MySQL snapt die input 'Jan's' waarschijnlijk gewoon niet. Ik denk dat je de handleiding van MySQL erbij moet nemen.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:04

Crazy D

I think we should take a look.

Het is al gezegt: je moet de enkele ' escapen, \' of een dubbele ' er van maken (afhankelijk van de database). In een string zetten heeft er niks mee te maken, omdat er dan nog steeds
'Jan's' naar de database wordt gestuurd, en je database dus denkt dat de string 'Jan' is en zich vervolgens afvraagt wat die s' er nog achteraan doet... :)

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Bedankt voor de snelle reacties. De tip met "Jan's" (dubbel buiten en enkele binnen) werkt inderdaad, maar nu heb ik nog het probleem dat ik graag wil weten of er een enkele quote in mijn string voorkomt. Normaal zoek dingen in een string met de functie Pos(Str, Substr). De functie geeft dan de positie terug waar de substr zich bevindt. Nu had ik daar ook al eens geprobeerd te zoeken met " ' " (dubbel-enkel-dubbel), maar wat ik daar ook probeer hij geeft altijd 0 terug (niet gevonden dus).

Enige oplossingen voor dit ?

P.S. QuotedStr() heb ik even naar gekeken, maar hier kom ik niet verder mee (het resultaat wordt dan 'Jan''s' en dit vindt ie niet zo leuk)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-04 23:14
Misschien is het beter om met parameters te werken.

Je maakt jouw sql statement als volgt:
code:
1
TQuery.SQL.Text := 'INSERT INTO namen (voornaam) VALUES ( :p_Voornaam )';


Daarna ga je mbhv de ParamByName() of Params[] member v/d TQuery component die parameter gaan 'binden':

code:
1
TQuery.Parameters ('p_Voornaam').AsString := Edit1.Text


Misschien moet je je dan helemaal niets meer aantrekken van die quotes etc.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Allemaal hartelijk dank voor de hulp, maar het is al gelukt inderdaad met QuotedStr(). Mijn fout hiermee was in eerste instantie dat ik daarna nog zelf quotes plaatste, dus zoals dit '''' + QuotedStr() + '''', maar het moet dus zonder de extra quotes.

Maar goed, het is weer opgelost dus ik ga weer verder :)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-04 23:14
ProgrammerX schreef op 30 september 2002 @ 13:36:
Allemaal hartelijk dank voor de hulp, maar het is al gelukt inderdaad met QuotedStr(). Mijn fout hiermee was in eerste instantie dat ik daarna nog zelf quotes plaatste, dus zoals dit '''' + QuotedStr() + '''', maar het moet dus zonder de extra quotes.

Maar goed, het is weer opgelost dus ik ga weer verder :)


Ik vraag me toch nog af hoe het zou aflopen met die parameters .......... ;)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

ProgrammerX schreef op 30 september 2002 @ 13:23:
Normaal zoek dingen in een string met de functie Pos(Str, Substr). De functie geeft dan de positie terug waar de substr zich bevindt. Nu had ik daar ook al eens geprobeerd te zoeken met " ' " (dubbel-enkel-dubbel), maar wat ik daar ook probeer hij geeft altijd 0 terug (niet gevonden dus).
code:
1
2
3
4
Pos('''', SQL); //werkt dit niet?!

handiger:
SQL := StringReplace(SQL, '''', '"', [rfReplaceAll]);

[ Voor 0% gewijzigd door LordLarry op 30-09-2002 13:41 . Reden: typo ]

We adore chaos because we like to restore order - M.C. Escher


Acties:
  • 0 Henk 'm!

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
LordLarry schreef op 30 september 2002 @ 13:40:
[...]


code:
1
Pos('''', SQL); //werkt dit niet?!
Volgens mij niet, want dit had ik namelijk ook al geprobeerd :) Ik dacht van 4 quotes maken normaal een enkele, dus zocht ik op 4 quotes maar dat werkt zo dus niet.
code:
1
2
handiger:
SQL := StringReplace(SQL, '''', '"', [rfReplaceAll]);
Ik heb hier delphi 4 en die help is al gaar bij de installatie, dus ik kan niet ff kijken welke functies er allemaal zijn. Ik kan gewoon nix vinden in de index en als ik op een standaard component sta en dan F1 druk vind ie het component ook niet :'( (dit lijkt erop alsof ie de index file van het helpbestand niet kan vinden, maar ik moet hier nog een keer goed heen kijken met dat tooltje van ze). Dit probleem doet zich niet voor bij delphi 3, 5 en 6. Is dit iets specifieks voor delphi 4 ofzo ??

P.S. Als reactie op de parameters, ik gebruik dezelfde query om alle insert, update en delete statements uit te voeren. Dus dan zou ik op runtime al alle parameters moeten aanmaken en daar heb ik niet zo veel zin in ;)

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Gebruik zoveel mogelijk parameters. Met strings is het nog wel op te lossen. Maar als je bijvoorbeelde met floating point getallen moet werken wordt het al minder (is het nou punt of komma). Als je parameters gebruikt hoef je je nergens meer wat van aan te trekken.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
LordLarry schreef op 30 september 2002 @ 13:40:

Pos('''', SQL); //werkt dit niet?!
Dit zal waarschijnlijk wel werken, ik was alleen ff zo blond op de vroege maandagmorgen om deze parameters om te wisselen, dus Pos(Str, '''') :)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-04 23:14
ProgrammerX schreef op 30 september 2002 @ 16:46:
[...]


ik was alleen ff zo blond

:(
Iets tegen blond?
:(

;)

https://fgheysels.github.io/

Pagina: 1