Ankündigung

Einklappen
Keine Ankündigung bisher.

Passwort vergessen funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Passwort vergessen funktioniert nicht

    Hallöchen,

    ich habe mich schon relativ gut in das Thema PHP reingefitzt. Nun stehe ich vor dem Problem, dass mein "Passwort vergessen" nicht funktioniert. Der Code lautet wie folgt:

    PHP-Code:
    <?php

        
    //PHP-Mailer
            
    use PHPMailer\PHPMailer\PHPMailer;
            use 
    PHPMailer\PHPMailer\Exception;


        require(
    "connect.php");
        if(isset(
    $_POST["recovery"])) {
            
    $stmt mysqli_prepare($link"SELECT email, first_name, name FROM user WHERE email LIKE ?");
            
    mysqli_stmt_bind_param($stmt"s"$_POST["recoveryMail"]);
            
    mysqli_stmt_execute($stmt);
            
    mysqli_stmt_bind_result($stmt$email$name$lastname);
            
    mysqli_stmt_store_result($stmt);
            
    $num_rows mysqli_stmt_num_rows($stmt);
            
    mysqli_stmt_fetch($stmt);
            
    mysqli_stmt_close($stmt);
        }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Passwort vergessen :(</title>
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <link href="css/font-awesome.min.css" rel="stylesheet">
        <link href="css/global.css" rel="stylesheet">
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    <body>
        <nav class="navbar navbar-default">
            <div class="container-fluid">
                <div class="navbar-header">
                    <a class="navbar-brand" href="./"><img alt="Kegeltipp" style="width:20px; height: 20px; display:inline-block;" src="../images/favicon.png"> <b>Kegeltipp</b></a>
                </div>
            </div>
        </nav>
        <div class="container">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <?php
    >>>>>>        if(isset($_GET["key"]) && !isset($_POST["recovery"])) {
                            
    $stmt mysqli_prepare($link"SELECT recoverykey FROM lostpassword WHERE recoverykey = ?");
                            
    mysqli_stmt_bind_param($stmt"s"$_GET["key"]);
                            
    mysqli_stmt_execute($stmt);
                            
    mysqli_stmt_bind_result($stmt$recoverykey);
                            
    mysqli_stmt_store_result($stmt);
                            
    $num_rows mysqli_stmt_num_rows($stmt);
                            
    mysqli_stmt_fetch($stmt);
                            
    mysqli_stmt_close($stmt);
                            if(isset(
    $_POST["newpassword"])) {
                                
    // get uid of user
                                
    $stmt mysqli_prepare($link"SELECT user.uid FROM user, lostpassword WHERE lostpassword.uid = user.uid AND lostpassword.recoverykey = ?");
                                
    mysqli_stmt_bind_param($stmt"s"$_GET["key"]);
                                
    mysqli_stmt_execute($stmt);
                                
    mysqli_stmt_bind_result($stmt$uid);
                                
    mysqli_stmt_fetch($stmt);
                                
    mysqli_stmt_close($stmt);

                                
    $stmt mysqli_prepare($link"UPDATE user SET password = ? WHERE uid = '" $uid "'");
                                
    mysqli_stmt_bind_param($stmt"s"password_hash($_POST["newpassword"], PASSWORD_BCRYPT));
                                
    mysqli_stmt_execute($stmt);
                                
    mysqli_stmt_close($stmt);

                                
    $stmt mysqli_prepare($link"DELETE FROM lostpassword WHERE uid = '" $uid "'");
                                
    mysqli_stmt_execute($stmt);
                                
    mysqli_stmt_close($stmt);
                                echo 
    '<div class="alert alert-success fade in" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>Dein Passwort wurde aktualisiert!</div>';
                            } else {
                                if(
    $num_rows == 0) {
                                    echo 
    '<div class="alert alert-danger fade in" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>Der Link ist ungültig oder abgelaufen!</div>';
                                } else {
                                    
    $newpassword true;

                                }
                            }
                        } else if(isset(
    $_POST["recovery"])|| (!isset($_GET["key"]) && !isset($_POST["recovery"]))) {
                            if(
    $num_rows 0) {
                                
    // generate unique key to DB
                                
    $key md5(uniqid(rand(), true));
                                while(
    true) {
                                    
    $stmt mysqli_prepare($link"SELECT recoverykey FROM lostpassword, user WHERE lostpassword.uid = user.uid AND user.email LIKE ?");
                                    
    mysqli_stmt_bind_param($stmt"s"$_POST["recoveryMail"]);
                                    
    mysqli_stmt_execute($stmt);
                                    
    mysqli_stmt_bind_result($stmt$recoverykey);
                                    
    $isUnique true;
                                    while(
    mysqli_stmt_fetch($stmt)) {
                                        if(
    $recoverykey == $key) {
                                            
    $isUnique false;
                                            break;
                                        }
                                    }
                                    
    mysqli_stmt_close($stmt);
                                    if(
    $isUnique) break;
                                }

                                
    // check if user already lostpassword / is in table
                                
    $stmt mysqli_prepare($link"SELECT recoverykey FROM lostpassword, user WHERE lostpassword.uid = user.uid AND user.email LIKE ?");
                                
    mysqli_stmt_bind_param($stmt"s"$_POST["recoveryMail"]);
                                
    mysqli_stmt_execute($stmt);
                                
    mysqli_stmt_store_result($stmt);
                                
    $num_rows mysqli_stmt_num_rows($stmt);
                                
    mysqli_stmt_close($stmt);

                                
    // get uid for user with email
                                
    $stmt mysqli_prepare($link"SELECT uid FROM user WHERE email LIKE ?");
                                
    mysqli_stmt_bind_param($stmt"s"$_POST["recoveryMail"]);
                                
    mysqli_stmt_execute($stmt);
                                
    mysqli_stmt_bind_result($stmt$uid);
                                
    mysqli_stmt_fetch($stmt);
                                
    mysqli_stmt_close($stmt);

                                  
    /*
                                      0: not in DB -> insert
                                      1: already in DB -> update
                                  */
                                
    if($num_rows == 0) {
                                    
    $stmt mysqli_prepare($link"INSERT INTO lostpassword (recoverykey, uid) VALUES ('" $key "', '" $uid "')");
                                    
    mysqli_stmt_execute($stmt);
                                    
    mysqli_stmt_close($stmt);
                                } else if(
    $num_rows 0) {
                                    
    $stmt mysqli_prepare($link"UPDATE lostpassword SET recoverykey = '" $key "' WHERE id = '" $uid "'");
                                    
    mysqli_stmt_execute($stmt);
                                    
    mysqli_stmt_close($stmt);
                                }

                                
    $msg '
                                    <html>
                                    <head>
                                        <title>Passwortzurücksetzung für...!</title>
                                    </head>
                                    <body>
                                           <p>Du hast eine Passwortzurücksetzung angefordert. Solltest du dies nicht getan haben kannst du diese Nachricht ignorieren.</p>
                                           <p>Klicke auf den Link <a href="https:/... '
    </a>, damit du dein Passwort zurückzusetzen kannst.</p>
                                    </
    body>
                                    </
    html>
                                
    ';

                                //PHP Mailer

                                require '
    /mail/Exception.php';
                                require '
    /mail/PHPMailer.php';
                                require '
    /mail/SMTP.php';

                                $mail = new PHPMailer(true);                              // Passing `true` enables exceptions

                                    //Server settings
                                    $mail->SMTPDebug = 2;                                 // Enable verbose debug output
                                    $mail->isSMTP();                                      // Set mailer to use SMTP
                                    $mail->Host = '
    ssmtp.gmail.com';                        // Specify main and backup SMTP servers
                                    $mail->SMTPAuth = true;                               // Enable SMTP authentication
                                    $mail->Username = '
    ...@gmail.com';              // SMTP username
                                    $mail->Password = '
    xxxx';                        // SMTP password
                                    $mail->SMTPSecure = '
    tls';                            // Enable TLS encryption, `ssl` also accepted
                                    $mail->Port = 587;                                    // TCP port to connect to

                                    //Recipients
                                    $mail->setFrom('
    xxx@gmail.com', 'Kegeltipp');
                                    $mail->addAddress($_POST["recoveryMail"]);     // Add a recipient

                                    //Content
                                    $mail->isHTML(true);                                  // Set email format to HTML
                                    $mail->Subject = '
    Passwortzurücksetzung auf xxx';
                                    $mail->Body    = $msg;

                                    if(!$mail->send()){
                                    echo '
    <div class="alert alert-danger fade in" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>Es ist kein Benutzer mit dieser Email registriert!</div>';
                                    }else{
                                    echo '
    <div class="alert alert-success fade in" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>Es wurde eine Email versandtdamit du dein Passwort zurücksetzen kannst.</div>';
                                }

                              }

                        mysqli_close($link);}

                    ?>
                    <div class="well shadow">
                        <form method="POST" action="">
                            <div class="form-group">
                                <label for="<?php echo ($newpassword ? "newpassword" : "recoveryMail") ?>"><?php echo ($newpassword ? "Neues Passwort:" : "Emailadresse:") ?></label>
                                <input type="<?php echo ($newpassword ? "password" : "email") ?>" class="form-control" required autocomplete="off" name="<?php echo ($newpassword ? "newpassword" : "recoveryMail") ?>" placeholder="<?php echo ($newpassword ? "Neues Passwort:" : "Emailadresse:") ?>">
                            </div>
                            <button type="submit" name="<?php echo ($newpassword ? "newpassword" : "recovery") ?>" class="btn btn-primary"><i class="fa fa-paper-plane" aria-hidden="true"></i> Absenden</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
        <div id="license" class="text-center">
            <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
                <img alt="Creative Commons Lizenzvertrag" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" />
                <span> <span style="color:#eee">|</span> CC-BY-NC-SA-Lizenz</span>
            </a>
            <br><span><a href="http://www.gemont.de">Gebrüder-Montgolfier-Gymnasium</a> | <a href="https://fusix.de">Manuel Bernhard</a></span>
        </div>
        <script src="js/jquery.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
    </body>
    </html>

    Die eingegebene Mail soll in der Datenbank gesucht werden und die dazugehörige ID in eine Tabelle "lostpassword" geschrieben werden. Ein Code wird generiert und per Mail an die angegebene Adresse geschickt. Leider funktioniert der Code ab der gekennzeichneten Stelle nicht. Es wird kein Eintrag in der Tabelle "lostpasswort" gemacht. Woran liegt das bzw. was ist an meiner If-Formel falsch?

    Ich hoffe die angegebenen Informationen reichen. Ansonsten einfach fragen und ich hoffe den Rest an Infos geben zu können.

    Danke schonmal für die Hilfe (:

  • #2
    Schau dir dein Code hier doch mal, am Highlight solltest du es eigentlich direkt sehen. Jede bessere IDE sollte dir den Fehler auch direkt anzeigen.

    Weiter solltest du dir mal die Antworten zum Thema Debugging anschauen:
    https://php-de.github.io/jumpto/faq/#debugging

    Kommentar


    • #3
      Und SQL-Quries haben nichts in einem Template/View zu suchen. Genauso wenig wie Configs jeglicher Art und auch kein SMTP-Client.
      Schau dir zum Thema Trennung von Eingabe, Verarbeitung und Ausgabe diesen Artikel an: https://php-de.github.io/jumpto/eva-prinzip/

      Kommentar


      • #4
        Bisher war mir das Ganze leider keine große Hilfe :/

        Ich habe am Code lediglich den SMTP-Client eingefügt. Seit dem funktioniert der nicht mehr. Auf was muss ich da achten?
        Und bitte verständlich... bin wie erwähnt Anfänger.

        Kommentar


        • #5
          Du verwendest in $msg ein Hochkomma, das nicht escaped ist. Das wird zu einem Parse-Error führen.
          Oder ist das nur beim hier reinkopieren und abändern der URL passiert?

          Die Tipps solltest du aber dennoch berherzigen und dir die geposteten Links anschauen.
          sorry, shift-taste kaputt

          Kommentar


          • #6
            Habe den PHP-Mailer jetzt nochmal entfernt und festgestellt, dass der Code auch so noch nen Fehler hat.
            Kann es damit zusammen hängen, dass beim Aufrufen der Seite weder "Recovery" noch "newPassword" übergeben wird?
            recovery steht ja gleich in der ersten Abfrage drin?

            Kommentar


            • #7
              Wenn Du #2 mal durcharbeitest, kannst Du Dir diese Frage selber beantworten.

              Lieferst Du Code nach #3, kann man Dir eher helfen. Bei Deinem Codegewurschtel ist das so zu aufwändig.

              Kommentar

              Lädt...
              X