Prüfen ob Email existiert problem

  • hey,


    ich habe kurz eine function geschrieben, doch ich habe irgendwas falsch gemacht. Weil er zeigt mir auch bei erfolgreicher Registrierung den Fehler 'Email existiert'.


    [PHP]
    <?php
    require_once 'dbconfig.php';
    <?php
    if(isset($_POST['senden']) && strtolower($_POST['senden'])) {

    if(strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {

    $email = htmlentities($_POST['email'], ENT_QUOTES, "UTF-8");
    $password = $_POST['password'];
    $vorname = htmlentities($_POST['vorname'], ENT_QUOTES, "UTF-8");
    $nachname = htmlentities($_POST['nachname'], ENT_QUOTES, "UTF-8");


    $error = '';


    function check($email) {
    include 'sec/verbindung.inc.php';
    $sql = 'SELECT email FROM user_daten WHERE email = $email';
    $stmt = $DB_con->prepare($sql);
    $check_row = $stmt->fetch(PDO::FETCH_ASSOC);


    if($stmt->rowCount() > 0) {
    return true;
    } else {
    return false;
    }
    }

    if(check($email) === false) {
    $error = 'Email existiert';
    }


    if(!$error) {

    $insert = $DB_con->prepare("INSERT INTO user_daten (email, password, vorname, nachname) VALUES (?, ?, ?, ?");
    $insert->BindValue(1, $email);
    $insert->BindValue(2, password_hash($password, PASSWORD_BCRYPT, $option));
    $insert->BindValue(3, $vorname);
    $insert->BindValue(4, $nachname);
    if($insert->execute()) {
    exit("<article id='erfolg_insert'><section id='content'><p class='susc_reg'>Sie haben erfolgreich einen Account erstellt.</p> <br> <p class='after_reg'><a href='login.php' class='now_log_after_reg'>Jetzt Einloggen</a></p> </section></article><?php");
    }
    }
    }
    }
    ?>
    <article id="a1-reg">
    <section id="content">
    <h2 class="h2-reg"> Registrieren </h2>
    <h3 class="h3-reg"> Kostenlos und schnell Registrieren </h3>
    <p class="genericon genericon-user"></p>
    </section>
    </article>

    <article id="a2-reg">
    <section id="content">
    <form action="<?php $_SERVER['REQUEST_METHOD']?>" method="POST">


    <?php if(isset($error)) { ?>
    <article id='error_info'>
    <section id='content'>
    <?php echo $error; ?>
    </section>
    </article>
    <?php } ?>

    <p><input type="email" name="email" placeholder="E-Mail Adresse"> <input type="email" name="atmail-g" placeholder="E-Mail Adresse Wiederholen"></p>
    <p><input type="password" name="password" placeholder="Passwort"> <input type="password" name="psw-g" placeholder="Passwort Wiederholen"></p>
    <p><input name="vorname" placeholder="Ihr Vorname"> <input name="nachname" placeholder="Ihr Nachname"></p>
    <p class="info-agb"> Beim Senden der Registration stimmen Sie automatisch der <a href="#" class="agb"> AGB</a> zu.</p>
    <p><input type="submit" class="send" value="Senden" name="senden"> <input type="reset" class="reset" value="Zur&uuml;cksetzen"></p>
    </section>
    </article>


    </main>
    </body>
    </html>
    [/PHP]


    War jetzt nur ein Beispiel hab oft die Codes verändert etc. nach halber/einer Stunde ging mir die Lust weg..

  • Hey,


    hast du dir mal
    $stmt->rowCount()


    ausgeben lassen, um zu gucken, ob deine Abfrage auch wirklich das liefert was du erwartest?


    Ist jetzt so auf den ersten Blick das wahrscheinlichste...


    Grüße Kanu

  • Und var_dump(check($email) liefert entsprechend Boolean true?


    Wenn ja:
    Macht zwar aus meiner Sicht grade keinen Sinn, aber mache mal den Vergleich ohne Typ-Prüfung, also nur mit ==

  • Das hast nu davon, wenn Du keine Platzhalter verwendest!
    Ok, ich sehe Du verwendest sie ja, aber einmal haste es "vergessen" -- und an der Stelle hast Du den Fehler gemacht.
    (steht alles in comments)


    BTW:

    PHP
    <form action="<?php $_SERVER['REQUEST_METHOD']?>" method="POST">


    Das macht doch keinen Sinn =)
    <?php $_SERVER['REQUEST_METHOD']?> -- OHNE echo schreib dort rein garnix hin.
    Was Du sicherlich willst ist, dass die gleiche Seite aufgerufen wird. Dann lass das Feld leer.

    PHP
    <form action="" method="POST"> <!-- action="" gleiche seite wird aufgerufen -->
  • 1. Danke für die Mühe und die tolle Erklärung!


    2. Wegen der Platzierung der function, ich habe die einfach irgendwo reingequetscht , das sollte alles nur ein Test sein ob es wirklich klappt. Bei Erfolg wollte ich dies dann auch umändern. Deswegen auch keine Platzhalter etc benutzt.


    3. Das mit dem PHP war ein fehler den ich vergessen habe weg zu machen :D sollte nicht stehen



    €:

    Zitat

    ("du hast also immer abgefragt: gibt mir email von user_daten wo email $email ist =)
    // ergo: immer 0 (keine) einträge gefunden)


    Wie sollte ich es dann schreiben?


    Habe es so gemacht, (mit dem gleichen Fehler aber dieses mal mit platzhalter)



    [PHP]
    function check($email) {
    $stmt = $DB_con->prepare("SELECT email FROM user_daten WHERE email = ?");
    $stmt->BindValue(1, $email);
    $stmt->execute();


    if($stmt->rowCount() > 0) {
    return true;
    } else {
    return false;
    }
    }


    if(check($email) === false) {
    $error = 'Email existiert';
    }
    [/PHP]

  • Nix reinquetschen. Wenn Du da mal was vergisst, dann können "komische Sachen" passieren.


    Das Problem war der Query-String:

    PHP
    <?php
    $email = 'q@q.de';
    $sql = 'select ... from ... where email = $email';


    Ergibt den String
    select ... from ... where email = $email
    wegen den einfachen Anführungszeichen.

    PHP
    <?php
    $email = 'q@q.de';
    $sql = "select ... from ... where email = $email";


    Ergibt den String
    select ... from ... where email = q@q.de
    =)

  • Also müsste ich es so schreiben:


    [PHP]
    $email = $_POST['email'];
    $password = $_POST['password'];
    $vorname = $_POST['vorname'];
    $nachname = $_POST['nachname'];


    $error = '';


    function check($email) {
    include 'sec/verbindung.inc.php';
    $stmt = $DB_con->prepare("SELECT email FROM user_daten WHERE email = ?");
    $stmt->BindValue(1, $email);
    $stmt->execute();


    if($stmt->rowCount() > 0) {
    return true;
    } else {
    return false;
    }
    }


    if(check($email) === false) {
    $error = 'Email existiert';
    }
    [/PHP]


    Habe die Strings mit ' ' geschrieben und die vorbereitungen mit " ". Falls es so richtig ist , dann funktoniert ist nicht.
    Falls du dich fragst wieso ich in der Function wieder eine DB verbindung habe:
    Wenn ich dies wegmache dann steht da undefined Variable stmt und undefined method prepare, d.h er findet keine Verbindung.

  • ungetestet (klar)


    Was nutzt Du eigl: mysqli_ oder PDO ?

  • Nutze Pdo. Habe es geschafft nur es ist etwas komisch.


    Er soll ja den Error zeigen wenn es falsch ist und das Programm abbrechen. Er tut es aber nicht sondern bei true tut er es.



    Wieso bei true?

  • Ha! Hab ich gar nicht gesehen :D
    Deine Funktion gibt do true zurück, wenn $stmt->rowCount() > 0,
    also die eMail gefunden wurde.


    Tipp: nenne Funktionen am besten immer danach, was sie tun.
    In dem Fall hier könnte die Funktion heißen: ifEmailExists($email)
    So liest man schon, was da passiert/erwartet wird: if email exists, ...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!