Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL direct - String in Datenbank-Feld eintragen (https://www.delphipraxis.net/118234-mysql-direct-string-datenbank-feld-eintragen.html)

Mb123 3. Aug 2008 15:11

Datenbank: MySQL • Zugriff über: MySQL direct

MySQL direct - String in Datenbank-Feld eintragen
 
Hallo,
Ich habe folgendes Problem, ich lese die Ip des Computer in einen string ein:
Delphi-Quellcode:
ip:=WebBrowser1.OleObject.Document.Body.InnerHtml;
Diese Ip möchte ich nun mit folgendem SQL-Statement in die Datenbank schreiben:
Delphi-Quellcode:
  q := ' INSERT INTO test (ip,uhr,aktion) VALUES('+ip+',NOW(),0);';
Ich kriege nun den Fehler, dass irgendwas an der SQL-Syntax nicht stimmt. Ich habe das Feld ip
in der Datenbank als VarChar vorliegen. Das Problem ist wahrscheinlich, dass man einen string
nicht ohne weiteres in ein VarChar-Feld eintragen kann :?

Muss ich vielleicht einfach den Typ des Ip-Feldes ändern ?

Danke für eure Antworten !

mkinzler 3. Aug 2008 15:15

Re: MySQL direct - String in Datenbank-Feld eintragen
 
Stringfelder musst du Quoten oder (SQL-)Parameter verwenden

Bernhard Geyer 3. Aug 2008 15:17

Re: MySQL direct - String in Datenbank-Feld eintragen
 
Wenn es ein String ist dann mußt du es auch SQL-Technisch in Hochkommas vorliegen.

Delphi-Quellcode:
q := ' INSERT INTO test (ip,uhr,aktion) VALUES('''+ip+''',NOW(),0);';
Bau aber deine Statement auf preparet statements um denn sonst hast du SQL-Injection-Probleme wenn der InnerHTML ein ergebnis der Art:

SQL-Code:
'; DROP Database...
liefert.

Mb123 3. Aug 2008 15:23

Re: MySQL direct - String in Datenbank-Feld eintragen
 
Okay bestens. An den Hochkommas hats gelegen.
Vielen Dank für die schnellen Antworten.

Mb123 5. Aug 2008 11:46

Re: MySQL direct - String in Datenbank-Feld eintragen
 
ich hätte da nochmal ein kleines problem:
die SQL-Syntax von Like ist ja wie folgt:
SQL-Code:
SELECT aktion FROM test WHERE ip LIKE 'ip'
Wenn ich ip jetzt als globale Variable deklariert hab, wie binde ich das dann (mit Hochkomma etc.) in den delphi code ein ?
Delphi-Quellcode:
q := ' SELECT aktion FROM test WHERE ip LIKE '''+ip+'''';
Diese Variante klappt nämlich nicht :?

mkinzler 5. Aug 2008 11:51

Re: MySQL direct - String in Datenbank-Feld eintragen
 
Delphi-Quellcode:
q := ' SELECT aktion FROM test WHERE ip LIKE '+QuotedStr(ip);

angos 5. Aug 2008 12:01

Re: MySQL direct - String in Datenbank-Feld eintragen
 
Zitat:

Zitat von Mb123
Delphi-Quellcode:
q := ' SELECT aktion FROM test WHERE ip LIKE '''+ip+'''';

auch das sollte gehen, ist doch eig nix anderes als die funktion QuotedStr :gruebel:

... du solltest aber beim like noch die Wildcards mit angeben, also wenn du zB nach einem Text suchst, in welchem die IP irgendwo drin vorkommt, dann so:

Delphi-Quellcode:
  q := ' SELECT aktion FROM test WHERE ip LIKE ''%'+ip+'%''';

Ob die Variable lokal oder global ist, ist egal

[edit] Kommt bei dir überhaupt eine Fehlermeldung, oder kommen einfach nur keine Datensätze zurück? Wenn nur keine Datensätze zurückkommen liegt das daran, dass du die Wildcards nicht gesetzt hast. Beispiel:

Eine Tabelle namens Namen beinhaltet das Feld Name mit foigenden Einträgen:

Peter
Erna
Ansgar
Martin
Klaus
Andrea


SQL-Code:
Select Name from Namen where Name like 'e'
die Abfrage gibt nichts zurück, da es kein Feld gibt in dem nur und ausschließlich ein e steht

SQL-Code:
Select Name from Namen where Name like '%e%'
Diese Abfrage sucht alle Datensätze in denen irgendwo ein 'e' vorkommt gibt folgende Datensätze zurück:

Peter
Andrea

SQL-Code:
Select Name from Namen where Name like '%a'
Diese Abfrage gibt nur Datensäze zurück die mit einem a aufhören, also:

Erna
Andrea



Den Rest der Sntax nun aber mal selber nachlesen :) Ich hoffe geholfen zu haben


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz