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:
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 (:
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">×</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">×</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">×</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">×</span></button>Es wurde eine Email versandt, damit 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 (:
Kommentar