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 ==

  • Ich bin mir nicht sicher ob das deinen Fehler auslöst, aber behebe doch mald as hier:

    PHP
    <?php
    require_once 'dbconfig.php';
                <?php

    ...

    Du doppelst den PHP-Start...

  • Hat nichts damit zu tun. Muss die Verbindung in function einfügen sonst zeigt er mir ein Fehler an, dass die Verbindung nicht gefunden wurde.

  • 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]

    3 Mal editiert, zuletzt von strong97 (20. Dezember 2015 um 12:52)

  • 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?

    2 Mal editiert, zuletzt von strong97 (23. Dezember 2015 um 01:01)

  • 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!