Wachtwoord vergeten script
Voor mijn website heb ik een optie om je wachtwoord op te vragen als je deze vergeten bent.
Alleen zegt hij telkens dat de opgegeven emails niet in de database staan.
Ze staan er echt in en de database werkt wel want registreren en inloggen werkt wel.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
if (!empty($_POST)){
// databaseverbinding invoegen
include("mysql_connect.inc.php");
$verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die("Verbinding mislukt: " . mysql_error());
mysql_select_db("databasepnl") or die("Kon de database niet openen: " . mysql_error());
// query samenstellen en uitvoeren
$sql = "SELECT * FROM gebruikers WHERE email='". $_POST["e"] ."'";
$result = mysql_query($sql) or die("Query mislukt: " . mysql_error());
// controleren of mail-adres is gevonden
if (!empty($result)){
// JA: variabelen toekennen
while($rij = mysql_fetch_array($result)){
$ontvanger = $rij ['email'];
$pass = $rij ['wachtwoord'];
}
// rest van het bericht opstellen, inclusief extra header
$onderwerp = "Uw wachtwoord";
$msg = "Hallo, u hebt verzocht om toezending van uw wachtwoord\n\n";
$msg .= "Uw wachtwoord is: " . $pass;
$msg .= "\n\nMet vriendelijke groet, de webmaster.";
$extra = "X-MAILER: PHP/versie " .phpversion();
// bericht verzenden en eventueel foutboodschap tonen
if (!mail($ontvanger, $onderwerp, $msg, $extra)){
$tekst = "Dit e-mail adres komt niet voor in onze database<br>Terug naar <a href=\"login.php\">inloggen</a> ";
echo($tekst);
}else{
$tekst = "Uw wachtwoord is verzonden.
Terug naar het <a href=\"login.php\">inloggen</a>";
echo($tekst);
}
}else{
// NEE, email-adres niet gevonden: foutmelding tonen
$tekst = "Dit e-mailadres (<b>". $_POST["email"] . "</b>) komt
niet voor in de database<br>\n
<a href=\"" . $_SERVER["PHP_SELF"] ."\">Ander e-mailadres</a>";
echo ($tekst);
}
// Indien pagina zichzelf niet heeft aangeroepen: HTML-formulier tonen
}else{
?>
if (!empty($_POST)){
// databaseverbinding invoegen
include("mysql_connect.inc.php");
$verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die("Verbinding mislukt: " . mysql_error());
mysql_select_db("databasepnl") or die("Kon de database niet openen: " . mysql_error());
// query samenstellen en uitvoeren
$sql = "SELECT * FROM gebruikers WHERE email='". $_POST["e"] ."'";
$result = mysql_query($sql) or die("Query mislukt: " . mysql_error());
// controleren of mail-adres is gevonden
if (!empty($result)){
// JA: variabelen toekennen
while($rij = mysql_fetch_array($result)){
$ontvanger = $rij ['email'];
$pass = $rij ['wachtwoord'];
}
// rest van het bericht opstellen, inclusief extra header
$onderwerp = "Uw wachtwoord";
$msg = "Hallo, u hebt verzocht om toezending van uw wachtwoord\n\n";
$msg .= "Uw wachtwoord is: " . $pass;
$msg .= "\n\nMet vriendelijke groet, de webmaster.";
$extra = "X-MAILER: PHP/versie " .phpversion();
// bericht verzenden en eventueel foutboodschap tonen
if (!mail($ontvanger, $onderwerp, $msg, $extra)){
$tekst = "Dit e-mail adres komt niet voor in onze database<br>Terug naar <a href=\"login.php\">inloggen</a> ";
echo($tekst);
}else{
$tekst = "Uw wachtwoord is verzonden.
Terug naar het <a href=\"login.php\">inloggen</a>";
echo($tekst);
}
}else{
// NEE, email-adres niet gevonden: foutmelding tonen
$tekst = "Dit e-mailadres (<b>". $_POST["email"] . "</b>) komt
niet voor in de database<br>\n
<a href=\"" . $_SERVER["PHP_SELF"] ."\">Ander e-mailadres</a>";
echo ($tekst);
}
// Indien pagina zichzelf niet heeft aangeroepen: HTML-formulier tonen
}else{
?>
<html>
<head>
<title>E-mail mijn wachtwoord</title>
</head>
<body>
<h2>U wachtwoord e-mailen</h2>
<form method="post" action="">
Uw e-mailadres:
<input type="Text" name="e" size="30">
<input type="Submit" value="E-mail mijn wachtwoord!">
</form>
</body>
</html>
Wie weet wat er fout is?
Alvast bedankt.
Gewijzigd op 08/12/2012 15:04:55 door John de Velden
if($_SERVER['REQUEST_METHOD'] == 'POST')
Gebruik geen 'or die', maar bouw goede foutafhandeling in.
Spring je code in, bij if-statements, while-lussen, zodat te zien is welke { bij } hoort.
Gebruik in php (echo) bij voorkeur ', zodat je in HTML " kunt gebruiken zonder al dat escapen.
Je mist volgens mij headers in je mail; gebruik liever phpmailer of swiftmailer.
Waarom variabelen kopiëren / onnodig aanmaken (regel 14, 15 en 18)?
Een while-lus is niet nodig op regel 13; een e-mailadres kan immers maar 1x voorkomen.
PHP_SELF zou onveilig zijn (hackbaar).
De ( ) bij de echo zijn niet nodig.
Je slaat kennelijk het wachtwoord zonder enige vorm van codering op in de database. Dat is erg onveilig.
Ten aanzien van je vraag: debuggen. Echo de query, klopt het pad wat er gevolgd wordt?
Ik zou na de query controleren of er 1 rij gevonden is. Zo ja; een mail sturen met daarin een nieuw wachtwoord wat de gebruiker eenmalig kan gebruiken om in te loggen. Indien niets gevonden een melding dat de combinatie van wachtwoord en emailadres niet is gevonden.
Ik had misschien moeten melden dat ik nog maar een scholier ben (HAVO 4) en we voor het vak Informatica een website moeten maken met nu nog alleen XHTML en PHP.
Dit alles gebeurt op een usb stick met usbwebserver.
Mijn database is gemaakt met phpmyadmin.
De veiligheid is nu nog niet belangrijk en de docenten vragen hier niks van en leggen ook niet uit hoe je het kan beveiligen.
Helaas snap ik niet alles wat u zegt en wou ik alleen weten wat ik misschien nog nodig zou moeten hebben om het te laten werken want de emails staan echt in de database maar hij blijft maar zeggen van niet.
Dus wat bedoelt u met: Ten aanzien van je vraag: debuggen. Echo de query, klopt het pad wat er gevolgd wordt?
Ik zou na de query controleren of er 1 rij gevonden is. Zo ja; een mail sturen met daarin een nieuw wachtwoord wat de gebruiker eenmalig kan gebruiken om in te loggen. Indien niets gevonden een melding dat de combinatie van wachtwoord en emailadres niet is gevonden.
Overigens is dit de fout melding: Warning: mail() [function.mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in H:\USBWebserver v8.5\8.5\root\php3\vergeten.php on line 24
Dit e-mail adres komt niet voor in onze database
Terug naar inloggen
Code (php)
1
2
2
if (!mail($ontvanger, $onderwerp, $msg, $extra)){
$tekst = "Dit e-mail adres komt niet voor in onze database<br>Terug naar <a href=\"login.php\">inloggen</a> ";
$tekst = "Dit e-mail adres komt niet voor in onze database<br>Terug naar <a href=\"login.php\">inloggen</a> ";
Als de mail() functie niet goed gaat, geef dan de error "Dit e-mail adres komt niet voor in onze database". Maar dat is helemaal niet de error. Als je dat nou eens veranderd naar "mail() functie doet het niet" dan zul je zien dat je dat als error krijgt
Not Moose heeft het bij het juiste eind, de mail() functie op xamp, wamp of lamp werkt vrijwel nooit omdat er geen koppeling is naar een echte mailserver. Je kan dit oplossen door phpmailer te gebruiken en daarin bijvoorbeeld gmmail als smtp server op te geven. Daarmee kan je wel email verzenden. De php mail() werkt weer wel bij hosting providers maar het is eenvoudiger om ook daar phpmailer toe te passen. Google op phpmailer om de scripts te vinden.