Das Tutorial muss erst freigegeben werden, um bei Giatu zu erscheinen.
Das Giatu-Team wird dieses Tutorial in Kürze bearbeiten! Du wirst per PN darüber informiert!
10x bewertet

LOGIN XIII - Passwort vergessen

von SmaX  |  29.11.2009 um 03:40 h
Skripte
Typ: Skripte
Stufe:Mittel
Hey!

Da ich mir ja gleich am Anfang die besten Wünsche aus der Wishlist rausgepickt habe, fahre ich jetzt mit der Erweiterung an Delites Loginreihe fort. Jetzt will ich die Loginreihe um eine Passwort vergessen-Funktion erweitern.

Das komplette Script ist schon auf die Loginreihe angepasst, d. h. ihr müsst nur noch bedingt Teile editieren.

Der Code ist komplett auskommentiert, aber ich nehme mir ein paar wichtige Programmteile heraus und erkläre sie.


Funktionen der Erweiterung:
-Überprüfen des Benutzernamens nach Eingabe
-Passwort generieren & in DB bearbeiten
-Neues Passwort per Email zuschicken


Also, los gehts!

Zuerst beginne ich mit der Funktion die später unser Passwort generieren soll. Den nachfolgenden Code solltet ihr in eure functions.inc.php - Datei einfügen, also in eure Funktionssammlung.



<?
// Funktion zur Erzeugung des Passwortes  

function generate_pw($anzahl) { //Funktion definieren 
$zeichen = array(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,
                                  
v,w,x,y,z,0,1,2,3,4,5,6,7,8,9);//
verwendete Zeichen 

        
for ($i=0$i<$anzahl$i++) { //Passwort wird generiert, es
werden soviele Zeichen verwendet wie im Funktionsaufruf angegeben 

        $pw 
.= $zeichen[rand(0,count($zeichen))]; 
    } 
       return 
$pw//Passwort zurückgeben 
}
?>





Diese Funktion generiert also unser späteres Passwort, wieviele Zeichen das Passwort enthält könnt ihr beim Aufruf selbst bestimmen. Alle Zeichen die zu Verfügung stehen sollen, können in das Array eingetragen werden (momentan A-Z und 0-9). In der for-Schleife wird dann jedes Zeichen zufällig ausgewählt und zu einem Passwort zusammengefügt, welches dann zurückgegeben wird.



Jetzt kommt das Hauptscript, welches die Emails verschickt und den Usernamen überprüft:






<?
//pwvergessen.php

include("header.php"); //Header einbinden
include("db.php"); //Datenbank einbinden
include("functions.inc.php"); // Funktionen einbinden


if(isset($_REQUEST["senden"])) { // Wenn abschicken gedrückt wurde
if(!empty($_REQUEST["user"])) { // Wenn Usernamefeld nicht leer
if(exist("mitglieder WHERE name =
'"
.addslashes($_REQUEST["user"])."'")) { // Wenn Username existiert

$hohlemail mysql_query("SELECT email FROM mitglieder WHERE name =
'"
.addslashes($_REQUEST["user"])."'"); // Datenbank abfrage
$email mysql_fetch_object($hohlemail);//Email aus Datenbank hohlen
$passwort generate_pw(10); //Passwort generieren (10 Zeichen)

$updatepw mysql_query("UPDATE mitglieder SET passwort =
'"
.md5($passwort)."' WHERE name =
'"
.addslashes($_REQUEST["user"])."'"); // Neues Passwort in DB
eintragen


$empfänger 
$email->email// Als Empfänger die Email aus DB
eintragen
$betreff 
"Passwort vergessen"// Betreff

$header  'MIME-Version: 1.0' "\r\n";//Mime-Version setzen
$header .= 'Content-type: text/html; charset=iso-8859-1' "\r\n";
//Content-Type für HTML-Email setzen

//HIER EIGENEN NAMEN UND EMAILADRESSE EINSETZEN
$header .= 'From: DEINE COMMUNITY <EMAILADRESSE>' "\r\n"

$nachricht "Hey! 
<br />
<br />
Du hast ein neues Passwort angefordert. Wir haben dir ein zufälliges
Passwort generiert,
welches Du aber wenn du eingeloggt bist wieder ändern kannst.
<br />
<br />
Hier dein Passwort:
<br />
<br />
<b>"
.$passwort."</b>
<br />
<br />
Viel Spaß noch!"
// Text der Email in HTML

$sendmail mail($empfänger$betreff$nachricht$header); // Email
wird verschickt

$meldung 
"Dein neues Passwort wurde dir soeben an deine Emailadresse
geschickt!"
// Meldung für erfolgreiche Übermittlung

}else{// Wenn Username nicht existiert..

$meldung "Dein Username existiert nicht!"//Meldung

}

}else{
// Wenn Feld leer..

$meldung "Das Eingabefeld ist leer!"//Meldung

}

}

?>




Die "vielen" Ifs oben sind berechtigt, da ich weiter unten bei den else′s so immer für jeden kleinen Fehler auch eine passende Fehlermeldung erzeugen kann, ohne das so eine billig Fehlermeldung kommt wie "Passwort konnte nicht generiert werden!". Solche Fehlermeldungen finde sehr unschön weil der User dann nicht weiß, an was es gelegen hat.

Das erste If ist für den Abschicken-Button. Das zweite If überprüft, ob das Username-Feld gefüllt ist und das dritte If, ob der Username auch existiert. Für das dritte If wird die Funktion "exist" benötigt, die normalerweise in der Formelsammlung vorhanden ist.

Den wichtigsten Teile erkläre ich jetzt nochmal genauer:




$hohlemail = mysql_query("SELECT email FROM mitglieder WHERE name =
'".addslashes($_REQUEST["user"])."'"); // Datenbank abfrage 

$email = mysql_fetch_object($hohlemail);//Email aus Datenbank hohlen 




Hier wird aus der Datenbank die Emailadresse des jeweiligen Users gehohlt, ich benenne die meisten Variablen immer nach dem, was sie machen, in diesem Fall "hohlemail".





$passwort = generate_pw(10); //Passwort generieren (10 Zeichen) 




Hier wird die Funktion "gernerate_pw" aufgerufen, in den Klammern könnt ihr angeben, wieviele Zeichen das spätere Passwort haben soll.




 

$updatepw = mysql_query("UPDATE mitglieder SET passwort =
'".md5($passwort)."'"); // Neues Passwort in DB eintragen   




mit $updatepw wird das neue Passswort gleich in die Datenbank geschrieben, natürlich auch mit md5 verschlüsselt.




<?
$empfänger 
$email->email// Als Empfänger die Email aus DB
eintragen $betreff "Passwort vergessen"// Betreff  

$header  'MIME-Version: 1.0' "\r\n";//Mime-Version setzen 
$header .= 'Content-type: text/html; charset=iso-8859-1' "\r\n";
//Content-Type für HTML-Email setzen  
//HIER EIGENEN NAMEN UND EMAILADRESSE EINSETZEN 
$header .= 'From: DEINE COMMUNITY <EMAILADRESSE>' "\r\n";   

$nachricht "Hey!  
<br /> 
<br /> 
Du hast ein neues Passwort angefordert. Wir haben dir ein zufälliges
Passwort generiert, welches Du aber wenn du eingeloggt bist wieder
ändern kannst. 
<br /> 
<br /> 
Hier dein Passwort: 
<br /> 
<br /> <b>"
.$passwort."</b> 
<br /> 
<br /> 
Viel Spaß noch!"
// Text der Email in HTML  

$sendmail mail($empfänger$betreff$nachricht$header); // Email
wird verschickt 
?>




Dieser Teil ist für die Email zuständig. Zuerst wird als Empfänger die Emailadresse aus der DB eingesetzt. Als Betreff wird "Passwort vergessen" gesetzt, was ihr auch ändern könnt.
Wenn man eine HTML-Email schicken will muss man den Content-Type auf HTML setzen.
Ich habe auch noch einen Absender in den Header mit eingebaut, sodass als Absender nicht die Emailadresse des Servers erscheint. Zuerst schreibt ihr eueren Namen statt "MEINE COMMUNITY" dann eure (beliebige) Emailadresse in die spitzen Klammern. Jetzt kommt die Nachricht, die könnt ihr nach belieben abändern, mit CSS stylen, Bilder einfügen usw.
Zum Schluss wird das ganze zu einer Email zusammengefügt und verschickt.

Als nächstes kommen noch die ganzen Meldungen, was passiert wenn z. B. das Formfeld nicht ausgefüllt ist usw. die könnt ihr natürlich auch noch abändern, was aber nicht unbedingt nötig ist.

Das PHP Script ist jetzt soweit fertig, jetzt kommt aber noch der HTML-Teil, den ich nicht erläutere, weil es sich dabei nur um ein einfaches Formular handelt. Wichtig ist dabei nur, das auch eure Datei "pwvergessen.php" heißt, sonst funktioniert das Formular nicht. Oder ihr benennt Datei und action=′pwvergessen.php′ um.

Natürlich müsst ihr zwischen Überschrift und Formular noch eine kleine Codezeile unterbringen, damit auch die Fehlermeldungen erscheinen:



<? echo $meldung?>






Das war meine Passwort vergessen - Erweiterung zu Delites Loginreihe. Ich hoffe ihr könnt das Script auch brauchen.

Lob, Kritik, Fragen und Anregungen sind wie immer natürlich erwünscht


MfG SmaX





15 Kommentare




Yuyeon

Erstmal habe ich 6 Sterne abgegeben und bedanke mich für die rasche Bearbeitung meines Wunsches. Leider klappt es nicht so, wie ich es haben möchte:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in [-mein Verzeichnis-] on line 25

Diese Fehlermeldung erscheint im "Hauptscript"...
Und die Anm. oder Hilfszeilen mit den // davor haben scheinbar auch PHP-Fehlermeldungen ausgelöst - aus welchen Gründen auch immer - und als ich diese entfernte, gabs dann halt das obere und dazu weiß ich leider nichts.

Wäre toll, wenn es direkt Dateien zum Downloaden und dann ggf. ersetzen oder hochladen gäbe, da kann man auch nicht viel falsch machen eigentlich.. Smilie
am 21.11.2009 um 01:19 Uhr


Yuyeon

Hm, ich glaube ich habe doch noch den möglichen Fehler gefunden...
werde morgen wieder daran sitzen, brauche erstmal Schlaf...
danke für das Tutorial nochmal :)
Falls was ist, melde ich mich wieder..
am 21.11.2009 um 01:29 Uhr


SmaX

Hi, in der Hauptansicht ist mein Tutorial zwar verschwunden, aber hier kann ich die Probleme von dir ja lesen. Ich werde mich darum kümmern, das ich das Tutorial zum Download bereit stelle.
am 21.11.2009 um 14:14 Uhr


SmaX

Ok, Danke liebes Giatu-Team!

Mein Tutorial ist ja doch noch online!

MfG SmaX
am 24.11.2009 um 18:50 Uhr


monkeybox

Um Probleme bei den Usern durch die falsche Darstellung der Codes zu vermeiden, mussten wir das Tutorial leider kurz rausnehmen.
am 24.11.2009 um 19:02 Uhr


anqel

funktioniert wunderbar!
dankeschön Smilie
am 29.11.2009 um 16:12 Uhr


Kritiker

Ich verstehe ja immer noch nicht, wieso ihr eure Datensätze aus MySQL als Objekte ausgebt. Arrays sind doch praktischer o.o′
am 29.11.2009 um 21:09 Uhr


SmaX

@ Krikiker: also ich finde das gewohnheitssache. Arrays sind halt von der Übersichtlichkeit her besser. Aber ich persönlich benutze Objekte weil ich das schon immer so gemacht habe Smilie
am 30.11.2009 um 16:02 Uhr


Sahni

Naja 100%ig angepasst war es jetzt vill nicht...zumindest ist die Bezeichnung der Benutzer immer "name" gewesen und nicht user Smilie
Aber das ist ja eher ein kleineres Problem, sonst top und sehr hilfsreich! Smilie
am 13.12.2009 um 12:31 Uhr


SmaX

Achso, jap sry aber ich hab meins eh n bisschen umgebaut.
am 13.12.2009 um 18:49 Uhr


CrazyMoFu

Also bei mir kommt in der pwvergessen.php immer:
Wichtig!:
Parse error: syntax error, unexpected T_VARIABLE in /data/multiserv/users/208478/projects/245321/www/login/pwvergessen.php on line 28

Ich steig da nicht hinter...
am 02.01.2010 um 00:05 Uhr


SmaX

mhm.. poste mir bitte mal den kompletten code von dir.. vielleicht hat sich ja ein kleiner Fehler eingeschlichen.
am 04.01.2010 um 12:53 Uhr


CrazyMoFu


<?
//pwvergessen.php

include("header.php");
include(
"css_nav.php");
include(
"css_lay.css");
include(
"css.php");
include(
"db.php");
include(
"functions.inc.php");


if(isset(
$_REQUEST["senden"])) {
if(!empty(
$_REQUEST["user"])) { 
if(
exist("mitglieder WHERE name =
'"
.addslashes($_REQUEST["user"])."'")) { 

$hohlemail mysql_query("SELECT email FROM mitglieder WHERE name =
'"
.addslashes($_REQUEST["user"])."'"); 
$email mysql_fetch_object($hohlemail);
$passwort generate_pw(10);

$updatepw mysql_query("UPDATE mitglieder SET passwort =
'"
.md5($passwort)."' WHERE name =
'"
.addslashes($_REQUEST["user"])."'"); 


$empfänger $email-> email
 
$betreff "Passwort vergessen"

$header  'MIME-Version: 1.0' "\r\n";//Mime-Version setzen
$header .= 'Content-type: text/html; charset=iso-8859-1' "\r\n";

$header .= 'From: Creative-Factory <creative-factory@gmx.net>' .
"\r\n";

$nachricht "Hey!
<br />
<br />
Du hast ein neues Passwort angefordert. Wir haben dir ein zufälliges
Passwort generiert,
welches Du aber wenn du eingeloggt bist wieder ändern kannst.
<br />
<br />
Hier dein Passwort:
<br />
<br />
<b>"
.$passwort."</b>
<br />
<br />
Viel Spaß noch!"


$sendmail mail($empfänger$betreff$nachricht$header);

$meldung "Dein neues Passwort wurde dir soeben an deine
Emailadresse geschickt!"


}else{
// Wenn Username nicht existiert..

$meldung "Dein Username existiert nicht!"

}

}else{
// Wenn Feld leer..

$meldung "Das Eingabefeld ist leer!"

}

}

?>




So das ist der ganze Code ich habe ihn auch schon durchgeschaut habe nicht wirklich etwas gefunden naja bin eh voll durcheinander die letzten tage..
am 04.01.2010 um 13:05 Uhr


SmaX

Hey, also bei mir geht der Code perfekt. Teste ihn bitte nochmal.
am 04.01.2010 um 15:56 Uhr


CrazyMoFu

Mhm liegt wohl an meinem Formular es klappt nicht.
Im formular muss doch nur der Benutzername angegeben werden oder?!
Wenn ich e-mail mitreinmache gehts auch nicht
am 25.01.2010 um 23:52 Uhr