AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein mysql_ecape_string! Warum stürzt das Ding dabei ab?
Thema durchsuchen
Ansicht
Themen-Optionen

mysql_ecape_string! Warum stürzt das Ding dabei ab?

Ein Thema von emsländer · begonnen am 28. Jun 2005 · letzter Beitrag vom 28. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#1

mysql_ecape_string! Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 06:14
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


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 06:37
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;
Volker
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 06:41
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


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 07:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#5

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 11:42
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


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 11:55
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]


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 11:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 12:05
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!
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#9

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 12:07
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
SetLength(tgt, i); nach dem Aufruf von mysql_real_escape_string() einsetzen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Warum stürzt das Ding dabei ab?

  Alt 28. Jun 2005, 12:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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