Registrierung

freeplate

Mitglied
Hallo,

ich programmiere gerade eine Webseite auf der man sich registrieren kann. Allerdings habe ich dabei Schwierigkeiten.

PHP:
       $sql_check = "SELECT * FROM user WHERE mail = $mail";
       $result = mysqli_query($con, $sql_check);
       if($result == false) {
           //--Daten in Tabelle eintragen: user--
           $sql = "INSERT INTO user (mail, passwort, nummer) VALUES ('".$mail."', '".$pw."', '')";
           //--Daten in Tabelle eintragen: reg_log--
           $sql_reg = "INSERT INTO reg_log(reg_time, last_log, anz_log) VALUES ('".$reg_time."', '', 0)";
       } else {
           echo "Es existiert bereits ein User mit dieser Email-Adresse.";
           exit();
       }

Ich überprüfe zunächst ob es bereits einen Account mit dieser Email-Adresse gibt. Falls nicht, soll der Account angelegt werden. Falls doch, dann soll eine Fehlermeldung kommen.

Er macht aber nicht das was er soll. Er erstellt in der Datenbank den User obwohl er schon existiert. D.h. mehrere Einträge mit der selben Email-Adresse.

Und wenn ich mit mysqli_num_rows() es versuche, dann kommt diese Fehlermeldung:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\money_maker\content\user\reg\sign_send.php on line 45

Hier ist der Code:

PHP:
       $sql_check = "SELECT * FROM user WHERE mail = $mail";
       $result = mysqli_query($con, $sql_check);
       if(mysqli_num_rows($result) > 0) {
           echo "Es existiert bereits ein User mit dieser Email-Adresse.";
           exit();
       } else {
           //--Daten in Tabelle eintragen: user--
           $sql = "INSERT INTO user (mail, passwort, nummer) VALUES ('".$mail."', '".$pw."', '')";
           //--Daten in Tabelle eintragen: reg_log--
           $sql_reg = "INSERT INTO reg_log (reg_time, last_log, anz_log) VALUES ('".$reg_time."', '', '0')";
       }

Habt ihr einen Rat für mich wie ich dieses Problem beheben kann?

Nochmal um sicher zu gehen: Die Daten werden in der Datenbank gespeichert, dass ist nicht das Problem. Das Problem liegt in der Überprüfung ob ein Account mit dieser Email Adresse bereits registriert ist.

Bitte um schnelle Antworten...
 
Hi

es gibt einige Probleme in deinem Code:

a) SQL-Injections. Infos zum beheben, mit prepare usw., gibts genug.

b) Wenn in einer DB-Spalte der Wert eindeutig sein soll, einfach Unique auf die Spalte setzen. In PHP dann gar nicht erst nach der Mailadresse suchen, sondern einfach einfügen und prüfen ob es funktioniert.
Einerseits ist das weniger Code, andererseits löst es auch eine Racecondition: Was ist, wenn deine Prüfung ergibt dass es die Mailadresse noch nicht gibt, und dann (aber vor der Einfügung) wird genau die Mailadresse von einer anderen PHP-Instanz eingefügt? zB. Browserprobleme, dass der selbe Request zweimal schnell hintereinander abgesendet wird, gibts genug...

c) Wenn mysqli_query false liefert heißt das nicht, dass es kein Ergebnis gab (das wäre false vom fetch, nicht vom query), sondern dass ein Fehler aufgetreten ist. (zB. Anführungszeichen um Stringwerte fehlen bei dir.)

d) Das ist auch der Grund für die Sache mit num_rows: query hat nicht funktioniert, liefert false statt ein Objekt mit Infos, und aus diesem false willst du jetzt eine Zeilenanzahl erfahren...
 
Und mein üblicher Nachtrag:
Bitte nicht SELECT * FROM user WHERE mail = $mail verwenden. Frag die konkreten Spalten der Tabelle ab, nicht * verwenden:
SELECT mail FROM user ....
Sollte sich Dein Tabellenaufbau irgendwann verändern, müsstest Du Dein Skript anpassen. Zudem ist die gezielte Spaltenabfrage performanter.
 
Zurück