AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [MySQL] überprüfen ob ein Datensatz existiert
Thema durchsuchen
Ansicht
Themen-Optionen

[MySQL] überprüfen ob ein Datensatz existiert

Ein Thema von BastardOp · begonnen am 7. Aug 2005 · letzter Beitrag vom 8. Aug 2005
Antwort Antwort
BastardOp

Registriert seit: 5. Jun 2005
71 Beiträge
 
Delphi 7 Personal
 
#1

[MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 20:15
Datenbank: MySQL • Zugriff über: libmysql.dll
Hi

ich hab ein Programm in dem ich auf eine MySQL Datenbank zugreife. Nun möchte ich überprüfen ob eine datensatz mit gewissen Bedingungen schon existiert. Die Abfrage sieht so aus:
SELECT * FROM user WHERE email='email' alledings gibt das bei mir immer eine zugriffs verletzung in der libmysql.dll wenn ein entsprechender eintrag NICHt existiert.

Wie kann ich nun überprüfen ob ein datensatz mit den gewünschten bedingungen existiert oder nicht?


MfG
BastardOp
Alle Menschen sind Ausländer FAST ÜBERALL!!!
Alle Rassisten sind ARSCHLÖCHER ÜBERALL!!!
  Mit Zitat antworten Zitat
Joachim Rohde

Registriert seit: 20. Jun 2004
24 Beiträge
 
#2

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 20:18
Zeig mal etwas Code... an deinem SQL-Statement dürfte es nämlich nicht liegen. Oder greifst du vielleicht auf die Resultmenge zu, die ja gar nicht existiert?
  Mit Zitat antworten Zitat
BastardOp

Registriert seit: 5. Jun 2005
71 Beiträge
 
Delphi 7 Personal
 
#3

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 20:26
so sieht der code zum abfragen bei mir aus

Delphi-Quellcode:
query:= 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

SetLength(Posts, mysql_num_rows(_myRes));
for i:= 0 to High(Posts) do
begin
_myRow := mysql_fetch_row(_myRes);
Alle Menschen sind Ausländer FAST ÜBERALL!!!
Alle Rassisten sind ARSCHLÖCHER ÜBERALL!!!
  Mit Zitat antworten Zitat
marabu

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

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 21:08
Wenn die Ergebnismenge leer ist, dann liefert dir mysql_num_rows 0 zurück. Verwendest du 0 zur Dimensionierung eines dynamischen Arrays, dann wird die Array-Variable Posts = nil. Du musst deinen Code ein wenig ändern:

Delphi-Quellcode:
query := 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

SetLength(Posts, mysql_num_rows(_myRes));
if Assigned(Posts) then // diese Zeile ist wichtig!
  for i:= 0 to High(Posts) do begin
    _myRow := mysql_fetch_row(_myRes);
    ...
  end;
Grüße vom marabu
  Mit Zitat antworten Zitat
BastardOp

Registriert seit: 5. Jun 2005
71 Beiträge
 
Delphi 7 Personal
 
#5

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 21:16
thx für die antwort werd ich morgen mal in aller ruhe ausprobiern.
Alle Menschen sind Ausländer FAST ÜBERALL!!!
Alle Rassisten sind ARSCHLÖCHER ÜBERALL!!!
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#6

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 7. Aug 2005, 23:14
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok. Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist. Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.
Abhilfe:
Delphi-Quellcode:
query := 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

If Assigned(_myRes) Then Begin // nur weitermachen, wenn was da ist
  SetLength(Posts, mysql_num_rows(_myRes));
  for i:= 0 to High(Posts) do begin
    _myRow := mysql_fetch_row(_myRes);
    ...
  end;
End;
Gruß, teebee
  Mit Zitat antworten Zitat
marabu

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

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 8. Aug 2005, 07:49
Hallo teebee,

Zitat von teebee:
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok.
In meinen Programmen resultiert dynArray = nil aus SetLength(dynArray, 0).

Zitat von teebee:
Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.
Das behauptet der thread owner, der gezeigte code gibt das aber nicht her.

Zitat von teebee:
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist.
Diese Implikation ist definitiv falsch. Die Kontrollstruktur für den result set wird auch für die leere Menge erzeugt.

Zitat von teebee:
Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.
Tatsächlich produziert der Aufruf von mysql_num_rows(nil) eine AV, wenn aber _myres nil ist, dann nicht wegen eines leeren result set, sondern eher wegen einer fehlerhaften query.

Grüße vom marabu
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: [MySQL] überprüfen ob ein Datensatz existiert

  Alt 8. Aug 2005, 08:24
Hallo marabu,
Zitat von marabu:
Zitat von teebee:
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok.
In meinen Programmen resultiert dynArray = nil aus SetLength(dynArray, 0).
In meinen auch. Aber High funktioniert trotzdem und liefert dann -1
Zitat von marabu:
Zitat von teebee:
Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.
Das behauptet der thread owner, der gezeigte code gibt das aber nicht her.
Doch. wenn _myres Nil ist, kommt es beim Aufruf von mysql_num_rows() genau dazu. (s.u)
Zitat von marabu:
Zitat von teebee:
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist.
Diese Implikation ist definitiv falsch. Die Kontrollstruktur für den result set wird auch für die leere Menge erzeugt.
Für eine SELECT-query (die wir hier ja zweifellos haben) hast Du allerdings recht.
Zitat von marabu:
Zitat von teebee:
Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.
Tatsächlich produziert der Aufruf von mysql_num_rows(nil) eine AV, wenn aber _myres nil ist, dann nicht wegen eines leeren result set, sondern eher wegen einer fehlerhaften query.
Stimmt natürlich, s.o.
_myRes sollte trotzdem auf Nil geprüft werden, wenn auch nicht, um eine leere Ergebnismenge abzufragen.

Gruß, teebee
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:54 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