Lesen in Datenbank mit mysqli

freeplate

Mitglied
Ich bin gerade dabei ein Registrierungsformular zu programmieren. Anschließend sollen die Daten auch in einer Datenbank gespeichert werden. So weit so gut. Das klappt auch. Aber natürlich soll man sich nur einmal mit dem selben Usernamen bzw. der selben Email-Adresse registrieren können. Und genau da ist der Knackpunkt. Ich kann mich so oft mit ein und derselben Email Adresse registrieren wie ich will...

Hier der Code:

PHP:
....
        //User schon vorhanden?
    $sql_user = "SELECT * FROM user WHERE username = $username OR mail = $mail";
    $anzahl = $mysqli->query($sql_user);
  
    if($anzahl == "") {
        //in Tabelle "user" eintragen
        $sql = "INSERT INTO user (username, mail, passwort, reg_time) VALUES ('".$username."', '".$mail."', '".$pw_ver."', '".$reg_time."')";
    } else {
        echo "User bereits vorhanden.";
        exit();
    }
  
    $mysqli->query($sql);
    {
        printf("%d Eingetragene Datensätze\n", $mysqli->affected_rows);
    }
?>

Wo liegt denn mein Fehler?
 
PHP:
$sql_user = "SELECT * FROM user WHERE username = $username OR mail = $mail";
Username und Mail sind Strings. Sie gehören in '

Zudem. Laut PHP-Hilfe zu mysqli::query
Rückgabewerte
Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE. For SELECT, SHOW, DESCRIBE or EXPLAIN mysqli_query() will return a result object.
Da dein SQL ein Fehler gibt (siehe Bemerkung oben) kommt false zurück. Sicher keine Anzahl wie dein Variblenname aussagt.

Zur Sicherheit würde ich da ein Prepared Statement draus machen. Zudem ein COUNT() für das Resultat
PHP:
    //User schon vorhanden?
    $sql_user = 'SELECT COUNT(*) as anzahl FROM user WHERE username = ? OR mail = ?';
    $stmt = $mysqli->prepare($sql_user);
   $stmt->bind_param('ss', $username, $mail);
   $stmt->bind_result($anzahl);
   $stmt->fetch();

   if($anzahl == 0){
       //TODO insert
   }
 
Erst einmal vielen Dank für die schnelle Hilfe.

Jetzt habe ich deinen Code-Vorschlag mal eingearbeitet,..

PHP:
...
    //User schon vorhanden?
    $sql_user = "SELECT COUNT (*) as anzahl FROM 'user' WHERE 'username' = $username OR mail = $mail";
    $stmt = $mysqli->prepare($sql_user);
    $stmt->bind_param('ss', $username, $mail);
    $stmt->bind_result($anzahl);
    $stmt->fetch();
   
    if($anzahl == 0) {
        //in Tabelle "user" eintragen
        $sql = "INSERT INTO user (username, mail, passwort, reg_time) VALUES ('".$username."', '".$mail."', '".$pw_ver."', '".$reg_time."')";
    } else {
        echo "User bereits vorhanden.";
        exit();
    }
   
    $mysqli->query($sql);
    {
        printf("%d Eingetragene Datensätze\n", $mysqli->affected_rows);
    }
?>

..er bringt mir jetzt aber diese Fehlermeldung:

Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in C:\xampp\htdocs\playnet\content\user\sign_send.php:44 Stack trace: #0 C:\xampp\htdocs\playnet\index.php(9): include() #1 {main} thrown in C:\xampp\htdocs\playnet\content\user\sign_send.php on line 44
 
Wurde die Variablen $username, $user oder $anzahl vorher schon verwednet?
gemäss Fehlermeldung müsste $username oder $user als Boolean daherkommen und nicht als String, wie ich das definiert habe.

Zudem, was sollen auf einmal diese Hochkomas um die Feldnamen im SQL? Weg damit. Die haben da nix verloren, ausser du willst auf den Text 'user' vergleich anstelle vom Feld user
 
Die Variable $username wird vorher schon verwendet. Ihn ihr wir ein Wert aus dem Formular gespeichert.
Eine Varible $user gibt es nicht. Das ist der Name meiner DB-Tabelle.
 
Also, ich habe jetzt nochmal was anderes ausprobiert, mit num_rows. Allerdings will das auch nicht klappen:

PHP:
<?php
    //Daten
    $username = $_POST["username"];
    $mail = $_POST["mail"];
    $pw1 = $_POST["pw1"];
    $pw2 = $_POST["pw2"];
   
    //Formular prüfen
    if($username == "" OR $mail == "" OR $pw1 == "" OR $pw2 == "") {
        echo "Bitte f&uuml;llen Sie das Formular vollst&auml;ndig aus.";
        exit();
    } elseif($pw1 != $pw2) {
        echo "Die eingegebenen Passw&ouml;rter stimmen nicht &uuml;berein.";
        exit();
    } elseif($pw1 == $username OR $pw1 == $mail) {
        echo "Das Passwort darf weder mit dem Usernamen noch der Email-Adresse &uuml;bereinstimmen.";
        exit();
    } elseif(!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        echo "Die eingegebene Email-Adresse ist nicht korrekt.";
        exit();
    }
   
    //Passwort verschlüsseln
    $pw = md5($pw1);
   
    //Zeitstempel
    $reg_time = time();
   
    //User schon vorhanden?
    //$query_m = "SELECT * FROM user WHERE mail = $mail";
    //$query_u = "SELECT * FROM user WHERE username = $username";
   
    //$res_m = mysqli_query($con, $query_m);
    //$res_u = mysqli_query($con, $query_u);
   
    $res = "SELECT * FROM user WHERE mail = $mail or username = $username";
    $zahl = mysqli_num_rows($con, $res);
   
    if($zahl === 0) {
        $sql = "INSERT INTO user (username, mail, passwort, reg_time) VALUES ($username, $mail, $pw, $reg_time)";
        $eintragen = mysqli_query($con, $sql);
    } else {
        echo "Es gibt bereits einen User mit diesem Usernamen und/oder dieser Email-Adresse.";
        exit();
    }
   
    {
        printf("%d Eingetragene Datens&auml;tze\n", $con->affected_rows);
    }
?>

Hier die Fehlermeldung:

Warning: mysqli_num_rows() expects exactly 1 parameter, 2 given in C:\xampp\htdocs\playnet\content\user\reg\sign_send.php on line 37
Es gibt bereits einen User mit diesem Usernamen und/oder dieser Email-Adresse.
 
Gut. Habe ich gemacht. Aber die Fehlermeldung bleibt die Selbe...

Warning: mysqli_num_rows() expects exactly 1 parameter, 2 given in C:\xampp\htdocs\playnet\content\user\reg\sign_send.php on line 30
-1 Eingetragene Datensätze

Und hier ist der Code:

PHP:
<?php
    //Daten
    $username = $_POST["username"];
    $mail = $_POST["mail"];
    $pw1 = $_POST["pw1"];
    $pw2 = $_POST["pw2"];
 
    //Formular prüfen
    if($username == "" OR $mail == "" OR $pw1 == "" OR $pw2 == "") {
        echo "Bitte f&uuml;llen Sie das Formular vollst&auml;ndig aus.";
        exit();
    } elseif($pw1 != $pw2) {
        echo "Die eingegebenen Passw&ouml;rter stimmen nicht &uuml;berein.";
        exit();
    } elseif($pw1 == $username OR $pw1 == $mail) {
        echo "Das Passwort darf weder mit dem Usernamen noch der Email-Adresse &uuml;bereinstimmen.";
        exit();
    } elseif(!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        echo "Die eingegebene Email-Adresse ist nicht korrekt.";
        exit();
    }
 
    //Passwort verschlüsseln
    $pw = md5($pw1);
 
    //Zeitstempel
    $reg_time = time();
 
    $res = "SELECT * FROM user WHERE 'mail' = $mail or 'username' = $username";
    $zahl = mysqli_num_rows($con, $res);
 
    if($zahl === 0) {
        $sql = "INSERT INTO user (username, mail, passwort, reg_time) VALUES ($username, $mail, $pw, $reg_time)";
        $eintragen = mysqli_query($con, $sql);
    } else {
        echo "Es gibt bereits einen User mit diesem Usernamen und/oder dieser Email-Adresse.";
        exit();
    }
 
    {
        printf("%d Eingetragene Datens&auml;tze\n", $con->affected_rows);
    }
?>

Also nochmal ganz genau was der Code machen soll:

übergebene Daten in Variablen speichern -> Eingaben auf Korrektheit überprüfen -> in der DB schauen, ob es schon einen User mit diesem Usernamen und / oder dieser Email-Adresse gibt
falls ja: Fehlermeldung
falls nicht: eintragen in die DB
 
Ok. Habe ich gemacht. Und die Daten werden jetzt auch eingetragen. Allerdings soll er ja auch überprüfen ob die Daten bereits vorhanden sind. Und das tut er überhaupt nicht. Ich kann jetzt die Daten wieder so oft ich will in die Datenbank eintragen. Und normalerweise sollte er die Daten nur einmal eintragen können... :/
 

Neue Beiträge

Zurück