Registrierung - Probleme bei der Überprüfung

freeplate

Mitglied
Hallo,

ich bin gerade dabei einen Code für eine Registrierung auf einer Webseite mit PHP und mysqli zu schreiben, allerdings habe ich dabei ein Problem bei der Überprüfung ob bereits ein User mit diesem Usernamen oder dieser Email registriert ist.

PHP:
<?php
                $username = $_POST["username"];
                $mail = $_POST["mail"];
                $pw1 = $_POST["pw1"];
                $pw2 = $_POST["pw2"];
               
                function ch_mail($mail){
                    if(strpos($mail, "@")) {
                        return true;        //Email-Adresse enthält @, also korrekt
                    } else {
                        return false;        //Email-Adresse enthält kein @, also nicht korrekt
                    }
                }
               
                function create(){
                    //Funktion zum erstellen des Bestätigungs-Codes
                    $create_array = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
                    $create_i = 0;
                    $created_output = "";
                    while($create_i <= 20) {
                        $create_random = rand(1,26);
                        $created_output.=$create_array[$create_random];
                        $create_i++;
                    }
                    return $created_output;
                }
               
                if($username != "") {
                    if($mail != "" AND ch_mail($mail)) {
                        if($pw1 != "" AND $pw1 == $pw2 AND $pw1 != $username AND $pw1 != $mail) {
                            $abfrage = $mysqli->query("SELECT username FROM user WHERE username = $username OR mail = $mail");
                            $erb_abfrage = $abfrage->field_count;
                            if($erg_abfrage == 0) {
                                //Passwort verschlüsseln
                                $pw = hash('sha512', $pw1);
                               
                                //Zeitstempel
                                $reg_time = time();
                               
                                //Status(0=User, 1=Admin)
                                $status = 0;
                               
                                $sql = "INSERT INTO user(username, mail, passwort, reg_time, last_log, log_anz, status) VALUES ('".$username."', '".$mail."', '".$pw."', '".$reg_time."', '', '0', '".$status."')";
                                if($mysqli->query($sql)) {
                                   
                                }
                            } else {
                                echo "User bereits vorhanden.";
                                exit();
                            }
                        } else {
                            echo "Bitte geben Sie ein Passwort ein. Es darf weder mit Ihrem Usernamen noch mit Ihrer Email-Adresse &uuml;bereinstimmen.";
                            exit();
                        }
                    } else {
                        echo "Bitte geben Sie eine korrekte Email-Adresse an.";
                        exit();
                    }
                } else {
                    echo "Bitte geben Sie einen Usernamen an.";
                    exit();
                } ?>

Bitte helft mir.

LG, freeplate
 
SELECT username FROM

Damit kann lediglich der Username überprüft werden. Vermutlich funktioniert das auch ganz toll, aber eine schon vorhandene E-Mail Adresse wird nicht erkannt weil die Spalte "mail" nicht abgefragt wird:

SELECT username,mail FROM
 
Ich habe das geändert, es funktioniert trotzdem nicht.. :/
Der User kann sich trotzdem mit den selben Daten sooft registrieren wie er Lust hat
 
Lies die Doku:
http://php.net/manual/de/mysqli.field-count.php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

$mysqli->query( "DROP TABLE IF EXISTS friends");
$mysqli->query( "CREATE TABLE friends (id int, name varchar(20))");

$mysqli->query( "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");


$mysqli->real_query("SELECT * FROM friends");

if ($mysqli->field_count) {
D. h. in deinem Fall müsste es lauten:
Code:
$erb_abfrage = $mysqli->field_count;
 
PPS: Offensichtlich ein Schreibfehler:
Code:
          $abfrage = $mysqli->query("SELECT username FROM user WHERE username = $username OR mail = $mail");
           $erb_abfrage = $abfrage->field_count;
           if($erg_abfrage == 0) {
Einmal $erb_abfrage und dann $erg_abfrage
 
@Sempervivum ja da liegt der Fehler. Nachdem ich es etwas umgebaut hatte, habe ich es auch gesehen.
Ich hatte es schon komplett umgebaut, da ich dies übersichtlicher finde:
PHP:
<?php
$mysqli = new mysqli("localhost", "root", "root", "testen");
if ($mysqli->connect_errno) {
    die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
}

//Username prüfen
if (isset($_POST["username"]) && !empty($_POST["username"])) {
    $username = $_POST["username"];
}else{
    echo "Bitte geben Sie einen Usernamen an.";
    exit();
}

//Email Prüfen
if (isset($_POST["mail"]) && !empty($_POST["mail"])) {
    $mail = $_POST["mail"];
    //Prüfen ob ein @ enthalten
    if(!ch_mail($mail)){
        echo "Bitte geben Sie eine korrekte Email-Adresse an.";
        exit();
    }
}else{
    echo "Bitte geben Sie eine Email-Adresse an.";
    exit();
}

//PW1 prüfen
if (isset($_POST["pw1"]) && !empty($_POST["pw1"])) {
    $pw1 = $_POST["pw1"];
}else{
    echo "Bitte geben Sie ein Passwort1 ein.";
    exit();
}

//PW2 prüfen
if (isset($_POST["pw2"]) && !empty($_POST["pw2"])) {
    $pw2 = $_POST["pw2"];
}else{
    echo "Bitte geben Sie ein Passwort2 ein.";
    exit();
}

//Prüfen ob PW1 Username oder Mail ist
if ($pw1 == $username || $pw1 == $mail) {
    echo "Passwort darf nicht mit Username oder Mail Adresse übereinstimmen.";
    exit();
}

//Passwörter vergleichen
if($pw1 == $pw2) {
    $abfrage = $mysqli->query("SELECT username,mail FROM user WHERE username = '".$username."' || mail = '".$mail."'");
    if($abfrage->num_rows == 0) {
        //Passwort verschlüsseln
        $pw = hash('sha512', $pw1);
       
        //Zeitstempel
        $reg_time = time();
       
        //Status(0=User, 1=Admin)
        $status = 0;
       
        $sql = "INSERT INTO user(username, mail, passwort, reg_time, last_log, log_anz, status) VALUES ('".$username."', '".$mail."', '".$pw."', '".$reg_time."', '', '0', '".$status."')";
        if($mysqli->query($sql)) {
            echo "Eintrag erfolgreich.";
            exit();
        }else{
            echo "Eintrag nicht erfolgreich";
            exit();
        }
    } else {
        echo "User bereits vorhanden.";
        exit();
    }
} else {
    echo "Passwort1 ist ist ungleich Passwort2";
    exit();
}

function ch_mail($mail){
    if(strpos($mail, "@")) {
        return true;        //Email-Adresse enthält @, also korrekt
    } else {
        return false;        //Email-Adresse enthält kein @, also nicht korrekt
    }
}

function create(){
    //Funktion zum erstellen des Bestätigungs-Codes
    $create_array = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
    $create_i = 0;
    $created_output = "";
    while($create_i <= 20) {
        $create_random = rand(1,26);
        $created_output.=$create_array[$create_random];
        $create_i++;
    }
    return $created_output;
}
 
Hi

das select username passt eigentlich schon - es geht ja nur darum, ob man mit dem WHERE danach überhaupt ein Ergebnis bekommt oder nicht.

Das Problem dürfte field_count sein - das ist nicht die Anzahl der Ergebnisse. Du suchst fetch für das erste Ergebnis, dann prüfen was das zurückgibt.

Sonstiges:

SQL-Injections - in deinem Code kann man die ganzen Kontrollen und Prüfungen leicht umgehen, und beliebigen Unsinn mit deinen DB-Daten machen.

rand() ist zwar einfach zu verwenden, aber nicht geeignet für schwer erratbare Sachen. Ich weiß zwar nicht, wo create() verwendet wird, aber wenn das die Mailbestätigung beim Registrieren sein soll, bitte ändern. Sonst kann man a) sich auch ohne gültige Mailadresse registrieren, wenn man ein bisschen Ahnung hat, und b) sich auch mit Mailadressen von anderen Leuten registrieren, und sich als die ausgeben.

Nochwas zur Sicherheit: Statt einem einzelnen Sha-Hash wäre PBDKF2 oder Bcrypt für Passwörter deutlich besser. (Immerhin hast du keinen MD5 - schon mal gut).
 

Neue Beiträge

Zurück