Honda: Doppeleintrag in DB vermeiden

Hallo,

ich versuche gerade ein kleines Party-Reservierungssystem (unter Verwendung einer MySQL-DB)zu basteln. Hierzu soll es möglich sein sich online auf die Gästeliste setzen zu lassen. Dabei wiederum sollen Doppeleinträge vermieden werden; dies versuche ich über die eingegebene Email-Adresse zu steuern.

Ich habe nun die Formularelemente "Vorname", "Nachname" und "Email" an eine Datei weitergeleitet (mittels form action) wo überprüft werden soll ob die angegebene Email-Adresse bereits in der Datenbank vorhanden ist.

Mein Versuch dies zu erledigen sieht so aus,... funktioniert aber irgendwie nicht ganz. Hat jemand eine Idee wie dies erfolgreicher gemacht werden kann? *am kopf kratz*
merci für alles!

$Email=$_Post['Email'];
$sql = "SELECT * FROM anmeldung WHERE Email='$Email'";
$num = mysql_num_rows($sql);

if($num=="1" or $num>"1")

{
echo "<center><font class=ueber1>Jede Person darf sich nur einmal anmelden</font></center><br>n";
echo"<br><center><a class=link href=anmeldung.php>Zurück</a></center>";
}
mysql_close();

  1. Hi,

    ich versuche gerade ein kleines Party-Reservierungssystem (unter Verwendung einer MySQL-DB)zu basteln.

    es sollte m.E. nicht beim Versuch bleiben.   ;-)

    Hierzu soll es möglich sein sich online auf die Gästeliste setzen zu lassen. Dabei wiederum sollen Doppeleinträge vermieden werden; dies versuche ich über die eingegebene Email-Adresse zu steuern.

    Eine findige, aber auch nicht unuebliche Eindeutigkeitsfindung.

    Ich habe nun die Formularelemente "Vorname", "Nachname" und "Email" an eine Datei weitergeleitet (mittels form action) wo überprüft werden soll ob die angegebene Email-Adresse bereits in der Datenbank vorhanden ist.

    Gut!

    Mein Versuch dies zu erledigen sieht so aus,... funktioniert aber irgendwie nicht ganz. Hat jemand eine Idee wie dies erfolgreicher gemacht werden kann? *am kopf kratz*
    merci für alles!

    Hmm, Du musst schon versuchen zu verstehen, was Du machst.

    $Email=$_Post['Email'];
    $sql = "SELECT * FROM anmeldung WHERE Email='$Email'";
    $num = mysql_num_rows($sql);

    if($num=="1" or $num>"1")

    {
    echo "<center><font class=ueber1>Jede Person darf sich nur einmal anmelden</font></center><br>n";
    echo"<br><center><a class=link href=anmeldung.php>Zurück</a></center>";
    }
    mysql_close();

    Ich neuere hier einfach mal mit dem Operator ">=", zum restlichen Code moechte ich mich jeglichen Kommentars enthalten. BTW - was funzt denn nicht? Fehlermeldungen oder Wert der Variable '$num' zum Zeitpunkt x?

    Gruss,
    Ludger

    1. BTW - was funzt denn nicht? Fehlermeldungen oder Wert der Variable '$num' zum Zeitpunkt x?

      Gruss,
      Ludger

      Hallo,

      es tut sich einfach gar nichts, .... ich versuche es zu testen indem ich mit dem Browser-Zurückbutton nochmal zum Formular gehe und wieder auf Absenden klicke,.... in der Datenbank steht dann ein Doppeleintrag (zwei mal die gleiche E-Mail-Adresse)

  2. Hallo Honda

    ich versuche gerade ein kleines Party-Reservierungssystem (unter Verwendung einer MySQL-DB)zu basteln. Hierzu soll es möglich sein sich online auf die Gästeliste setzen zu lassen. Dabei wiederum sollen Doppeleinträge vermieden werden; dies versuche ich über die eingegebene Email-Adresse zu steuern.

    Da ich davon ausgehe, dass eine Person durchaus mehrere Parties besuchen darf, wenn er will, muss die Kombination aus E-Mail-Adresse und Party-Identifizierung eindeutig sein.

    Mein Versuch dies zu erledigen sieht so aus,... funktioniert aber irgendwie nicht ganz. Hat jemand eine Idee wie dies erfolgreicher gemacht werden kann? *am kopf kratz*

    Sobald einer einmal auf einer Party war, darf er nicht mehr :-)

    Eine Idee:
    Ein kombinierter eindeutiger Index über die Spalten der E-Mail-Adresse und Party-Nummer. Mache ein INSERT. Rechne damit, dass Fehler auftreten.
    Kein Fehler: Erfolgreiche Anmeldung
    Fehler "Indexverletzung": Versuch einer Doppelanmeldung
    Sonstiger Fehler: Was auch immer.

    Freundliche Grüße

    Vinzenz

    1. Hello,

      Eine Idee:
      Ein kombinierter eindeutiger Index über die Spalten der E-Mail-Adresse und Party-Nummer. Mache ein INSERT. Rechne damit, dass Fehler auftreten.
      Kein Fehler: Erfolgreiche Anmeldung
      Fehler "Indexverletzung": Versuch einer Doppelanmeldung
      Sonstiger Fehler: Was auch immer.

      Kleine Ergänzung:

      mysql_errno() und das Resultset sollte man immer abfragen.
      Nur wenn mysql_errno() == 0 ist, konnte das Statement wunschgemäßausgeführt werden.
      Aber auch wenn es == 0 ist, muss nicht unbedingt 'was passiert werden.
      Dann sind ggf. noch die mysql_affected_rows() von Interesse.

      Beispiel:  delete from $tablename where id_party = $id_party and email = $email;  #[1]

      Wenn kein Treffer vorhanden war, konnte das Statement trotzdem fehlerfrei ausgeführt werden.
      Allerdings muss das nicht unbedingt das erwartete Ergebnis gewesen sein.

      [1] $id_party vorher auf unsigned Integer geprüft
          $email vorher mit mysql_[real_]escape_string() behandelt

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. funktioniert aber irgendwie nicht ganz

    ist meistens keine ausreichende Fehlerbeschreibung.

    $Email=$_Post['Email'];
    $sql = "SELECT * FROM anmeldung WHERE Email='$Email'";
    $num = mysql_num_rows($sql);

    • mysql_num_rows() kann man nicht mit dem SQL-Statement füttern. Das muss an mysql_query() gegeben werden.

    • Dein SQL-Statement ist für diesen Zweck ungeeignet. Wenn du die Anzahl wissen willst, solltest du die DB nach der Anzahl fragen, und sie nicht erst eine Ergebnisliste erstellen lassen, die du dann doch nicht haben willst:

    SELECT COUNT(*) FROM ...

    • Dein Code ist anfällig gegenüber unerwarteten Zeichen. Auch wenn du ein ' nicht in einer Email-Adresse erwartest, kann es jemand in das Eingabefeld eingeben. Mindestens deshalb sollten solche Werte mit mysql_real_escape_string() behandelt werden.

    $sql = sprintf(
      "SELECT COUNT(*) FROM anmeldung WHERE Email='%s'",
      mysql_real_escape_string($Email));

    • Du hast das error_reporting nicht auf E_ALL gesetzt, so dass dir verborgen blieb, dass $_Post nicht existiert. Richtig heißt das $_POST (Großschreibung!).

    • Warum hast du die Warnung, die bei mysql_num_rows ausgegeben wurde unterschlagen?

    Noch weitere Fragen? :-)