Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   mysql_ecape_string! Warum stürzt das Ding dabei ab? (https://www.delphipraxis.net/48623-mysql_ecape_string-warum-stuerzt-das-ding-dabei-ab.html)

emsländer 28. Jun 2005 06:14


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:
  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;
Die Routine esacpestring:
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

Flocke 28. Jun 2005 06:37

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;

emsländer 28. Jun 2005 06:41

Re: Warum stürzt das Ding dabei ab?
 
Zitat:

Zitat von Flocke
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;

Bringt leider auch eine Zugriffsverletzung :(

Gruss

EL

marabu 28. Jun 2005 07:57

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:
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.
Noch ein Nachtrag - mit MYSQL.PAS geht auch das bei mir:

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.

emsländer 28. Jun 2005 11:42

Re: Warum stürzt das Ding dabei ab?
 
Zitat:

Zitat von marabu
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:
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.
Noch ein Nachtrag - mit MYSQL.PAS geht auch das bei mir:

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.

warum setzt Du hier: SetLength(tgt, Length(src) * 4); die Länge x4 ?

Gruss

EL

emsländer 28. Jun 2005 11:55

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]

marabu 28. Jun 2005 11:59

Re: Warum stürzt das Ding dabei ab?
 
Zitat:

Zitat von emsländer
warum setzt Du hier ... die Länge x4 ?

Ich konnte auf die Schnelle nicht genau abschätzen, um wieviel Byte der string anwächst, wenn die ganzen escapes eingebaut sind - dachte mir mal 4 und ich bin auf der sicheren Seite.

marabu

Speedmaster 28. Jun 2005 12:05

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!

scp 28. Jun 2005 12:07

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:
SetLength(tgt, i);
nach dem Aufruf von mysql_real_escape_string() einsetzen.

marabu 28. Jun 2005 12:14

Re: Warum stürzt das Ding dabei ab?
 
Zitat:

Zitat von emsländer
Jetzt bekomme ich einen mysql-Error

Welchen?
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:
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;
marabu

@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 05:46 Uhr.
Seite 1 von 2  1 2      

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