![]() |
mysql_ecape_string! Warum stürzt das Ding dabei ab?
Moin,
ich lese eine Bilddatei in die Variable img ein. Möchte die dann mit mysql_escape_string bearbeiten.
Code:
Die Routine esacpestring:
img_fs := TFilestream.Create(img_pfad, fmopenread);
img_sstream := Tstringstream.Create(''); try img_fs.position := 0; img_sStream.CopyFrom(img_fs,img_fs.size); img_sStream.Position := 0; img := escapestring(img_ssTream.DataString); // hier der Aufruf finally freeandnil(img_fs); freeandnil(img_sStream); end;
Code:
function Tform1.escapestring(str:String):String;
var res:String[101]; len : integer; // p:pointer; begin len:=mysql_escape_string(@res[1],PChar(str),length(str)); setlength(res,len); result:=res; end; Beim Aufruf von escapestring(.....) hängt der sich weg und kommt mit dem "CPU-Debugger" Wo ist hier der Denkfehler? mir wäre nat. noch lieber, wenn ich da mysql_real_escape_string einsetzen könnte. Doch wie bekomme ich den Datentyp PMYSQL in einen String gewandelt? Gruss EL |
Re: Warum stürzt das Ding dabei ab?
Bin mir nicht 100%-ig sicher, aber ich denke mal es liegt daran, dass du schon einen String übergibst obwohl du die Länge nicht weisst. Probier mal diese Fassung (nicht getestet):
Delphi-Quellcode:
function Tform1.escapestring({const} str: String): String;
var len: integer; begin len := mysql_escape_string(nil, PChar(str), Length(str)); SetLength(Result, len); mysql_escape_string(@Result[1], PChar(str), Length(str)); end; |
Re: Warum stürzt das Ding dabei ab?
Zitat:
Gruss EL |
Re: Warum stürzt das Ding dabei ab?
Hallo EL,
ich vermisse die Deklaration der function mysql_escape_string() und die Angabe auf welcher DLL (libmysql.dll? Version?) du aufsetzt. Was muss man machen, um dein Problem nachzustellen? Grüße vom marabu Nachtrag: ... aber das hält mich nicht auf. Bei mir funktioniert es.
Delphi-Quellcode:
Noch ein Nachtrag - mit MYSQL.PAS geht auch das bei mir:
program test;
{$APPTYPE CONSOLE} uses SysUtils; var src, tgt: string; i: integer; function mysql_escape_string(szTo, szFrom: pchar; len: cardinal): cardinal; stdcall; external 'libmysql'; begin src := 'geht doch'#13#10'oder etwa nicht?'; SetLength(tgt, Length(src) * 4); i := mysql_escape_string(pchar(tgt), pchar(src), Length(src)); WriteLn(tgt); ReadLn; end.
Delphi-Quellcode:
program test;
{$APPTYPE CONSOLE} uses SysUtils, MySQL; var src, tgt: string; i: integer; my: PMySQL; begin my := mysql_init(nil); if mysql_real_connect(my, 'localhost', 'root', '', 'conpresso', 0, nil, 0) = my then begin src := 'geht doch'#13#10'oder etwa nicht?'; SetLength(tgt, Length(src) * 4); try i := mysql_real_escape_string(my, pchar(tgt), pchar(src), Length(src)); WriteLn(tgt); except on E:Exception do WriteLn(e.message); end; ReadLn; end; mysql_close(my); end. |
Re: Warum stürzt das Ding dabei ab?
Zitat:
Gruss EL |
Re: Warum stürzt das Ding dabei ab?
Jetzt bekomme ich einen mysql-Error - ich kotz gleich ;-) (Info: ich nutze mysql.pas)
ich poste jetzt hier mal den Code:
Delphi-Quellcode:
// _spoccon ist eine globale Variable - der Verbindungsdescriptor function Tform1.append_satz (dateiname : string) : boolean; var img_pfad, thumb_pfad, dateibody, bildnr, extension : string; stmp : string; query : pchar; datei : pchar; img : string; thumb : string; img_fs : tfilestream; img_sstream : Tstringstream; thumb_fs : Tfilestream; thumb_sstream : Tstringstream; errorcode : integer; begin datei := Strlower(pchar(dateiname)); dateiname := AnsiToUtf8(datei); img_pfad := label1.caption + '\'+ dateiname; thumb_pfad := label2.caption + '\'+ dateiname; img_fs := TFilestream.Create(img_pfad, fmopenread); img_sstream := Tstringstream.Create(''); try img_fs.position := 0; img_sStream.CopyFrom(img_fs,img_fs.size); img_sStream.Position := 0; img := escapestring(img_ssTream.DataString); finally freeandnil(img_fs); freeandnil(img_sStream); end; thumb_fs := TFilestream.Create(thumb_pfad, fmopenread); thumb_sstream := Tstringstream.Create(''); try thumb_fs.position := 0; thumb_sStream.CopyFrom(thumb_fs,thumb_fs.size); thumb_sStream.Position := 0; thumb := escapestring(thumb_ssTream.DataString); finally freeandnil(thumb_fs); freeandnil(thumb_sStream); end; extension := ExtractFileExt(dateiname); dateibody := stringreplace(dateiname, extension, '', [rfReplaceALL]); bildnr := StringReplace(dateibody, 'img_', '', [rfReplaceALL]); stmp := 'INSERT INTO BILDER (img_nr, thumb, bild, galerie, fsk) VALUES ('; stmp := stmp + '"' + thumb + '", '; stmp := stmp + '"' + img + '", '; stmp := stmp + '"' + bildnr + '", '; stmp := stmp + '"01", '; stmp := stmp + '"J")'; query := PCHAR(stmp); errorcode := mysql_real_query(_spoccon, query, Length(query)); stmp := mysql_error(_spoccon); // showmessage(stmp); end; function Tform1.escapestring({const} str: String): String; var i: integer; tgt: string; begin SetLength(tgt, Length(str) * 4); try i := mysql_real_escape_string(_spoccon, pchar(tgt), pchar(str), Length(str)); except on E:Exception do showmessage('Fehler: '+e.message); end; result := tgt; end; Vielleich sehen die Kollegen hier jetzt ein wenig klarer Und vielen Dank im Vorraus Gruss EL [edit=alcaeus]code- durch delphi-Tags ersetzt. Mfg, alcaeus[/edit] |
Re: Warum stürzt das Ding dabei ab?
Zitat:
marabu |
Re: Warum stürzt das Ding dabei ab?
Ich möchte nix zum Thema sagen, aber trotzdem wichtig: "Thread Namen aussagekräftig machen, der Threadname 'Warum stürzt das Ding dabei ab?' ist nicht Aussagekräftig!
|
Re: Warum stürzt das Ding dabei ab?
Ich weis nicht, ob i die tatsächliche Länge zurück gibt, sollte das der Fall sein müsste man bei Marabus Methode noch
Delphi-Quellcode:
nach dem Aufruf von mysql_real_escape_string() einsetzen.
SetLength(tgt, i);
|
Re: Warum stürzt das Ding dabei ab?
Zitat:
An welcher Stelle? Hat mein Code bei dir funktioniert? Hast du deine Funktion EscapeString() einzeln getestet? Die Funktion würde ich nicht als method of object deklarieren und die Verbindungsvariable würde ich mit übergeben:
Delphi-Quellcode:
marabu
function EscapeString(my: PMySQL; const s: String): String;
begin SetLength(Result, Length(s) * 4); SetLength(Result, mysql_real_escape_string(my, pchar(Result), pchar(s), Length(s)); end; @scp: es wird die richtige Länge zurück gegeben, das abschließende SetLength() schont den Heap, verursacht aber keinen Fehler. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz