Hallo 08154711
Zum Thema Login mit php/mysql hier mal eine kleine schematische Erklärung:
Das du zur DB connecten und daten auslesen kannst setze ich voraus.
Sessions sollten dir ebenfalls nicht fremd sein.
Zuerst bastelst du dir ein login-Formular, bestehend aus nem text-feld,nem password-feld und nem submit button. Als
method sollte hier
post gesetzt sein.
action setzt du das aktuelle Skript, sodass die Seite auf sich selbst verlinkt.
Die Idee ist nun folgende: Immer, wenn die Seite aufgerufen wird, wird überprüft ob
- Logindaten übermittelt wurden
- bereits eine session besteht (also der User eingeloggt ist)
Um in erfahrung zu bringen, ob jemand Logindaten übermittelt hat, fragst du lediglich die betreffenden variablen ab, zb:
Code:
$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;
Der übergebene Wert für
password wird hier per sha1 verschlüsselt. Das ist sicherer als md5, erfüllt aber den gleichen Zweck: Es ist unsinnig Passwörter im Klartext in der DB zu hinterlegen. Stattdessen werden sie verschlüsselt abgelegt und auch nur mit den verschlüsselten Werten verglichen.
Wenn also Passwort und Login gesetzt sind - und nur dann - startest du einen login:
Code:
if (isset($login) && isset($password)){
$dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
if ($dbLoginData){
$userData = mysql_fetch_array($dbLoginData);
if ($userData["password"]==$password){
header("Location: http://".$_SERVER["HTTP_HOST"]);
exit;
}
}
}
Diese Zeilen setzen voraus, dass du bereits zu einer DB verbunden bist, es dort eine Tabelle
user gibt, die mindestens die Spalten
id,
password und
login enthält.
Die Anfrage
mysql_query... liefert eine MySQL-Ressource zurück, die alle gematchten Ergebnisse enthält. Schlug der Aufruf fehl, so ist
$dbLoginData false.
Um die MySQL-Ressource lesbar zu machen wird Sie mittels mysql_fetch_array in ein assoziatives Array umgewandelt, dessen Assoziationen den Spalten namen der Tabelle entsprechen (
id,
password und
login).
Da ein login immer eineindeutig sein sollte, erhälst du insgesamt nur ein eindimensionales Array. Sollten weitere Matches vorhanden sein, so könntest du sie ebenfalls per mysql_fetch_array auslesen.
Und dann wird das übermittelte und verschlüsselte Passwort mit dem verglichen, dass der Datenbankaufruf zurückgeliefert hat.
Code:
if ($userData["password"]==$password){
Wenn beide Zeichenketten übereinstimmen, waren die Logindaten korrekt.
Hier passiert jetzt etwas magisches: Das Skript leitet sich sofort auf sich selbst um, bzw. auf den host, auf dem es ausgeführt wird. Das hat zwei Gründe
- da hier Daten mit der Methode post übergeben wurden, gibt es unschöne effekte beim Aktualisieren der Seite. Hier schafft der Redirect Abhilfe.
- Den Rest des Login-Systems sollen Sessions übernehmen
Der befehl
exit; verhindert, dass nach dem Redirect versehentlich noch Befehle ausgeführt werden.
Damit nach einem Redirect der Server eine Session erkennen kann, muss natürlich eine entsprechende Session-Variable gesetzt werden. In desem Fall wird das die Variable
$_SESSION["userId"] sein, die den Wert bekommt, den die DB-Abfrage als id des angemeldeten Users ergeben hat.
Um solch eine Variable setzen zu können, muss vor dem Login-Prozess eine Session gestartet bzw. wieder aufgenommen worden sein. das erledigt
session_start();
Eingefügt sieht dass dann so aus:
Code:
session_start();
$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;
if (isset($login) && isset($password)){
$dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
if ($dbLoginData){
$userData = mysql_fetch_array($dbLoginData);
if ($userData["password"]==$password){
header("Location: http://".$_SERVER["HTTP_HOST"]);
$_SESSION["userId"] = $userData["id"];
exit;
}
}
}
Damit haben wir sicher gestellt, dass die Infos, welcher User sich angemeldet hat, in einer Session gespeichert sind. Nach dem Redirect, wird der Test, ob sich jemand anmelden zu versucht, fehlschlagen, da keine Formulardaten übermittelt wurden.
Jetzt ist es also an der Zeit, festzustellen, ob breits jemand angemeldet ist.
session_start(); nimmt hierbei automatisch die vorher gestartete Session wieder auf. Alles was wir zun müssen, ist also festzustellen, ob die Sessionvariable
$_SESSION["userId"] gesetzt ist.
Code:
$userIsLoggedIn = isset($_SESSION["userId"]) ? true : false;
$userId = $_SESSION["userId"];
if ($userIsLoggedIn){
echo "Es ist der Benutzer mit der ID $userId angemeldet.";
}
else{
echo "Es ist kein Benutzer angemeldet.";
}
Wenn die Session-Variable gesetzt ist, wird die ID des angemeldete Users ausgegeben.
Falls nicht, eine entsprechende negative Nachicht.
Alles zusammen sieht dann so aus:
Code:
session_start();
$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;
if (isset($login) && isset($password)){
$dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
if ($dbLoginData){
$userData = mysql_fetch_array($dbLoginData);
if ($userData["password"]==$password){
header("Location: http://".$_SERVER["HTTP_HOST"]);
$_SESSION["userId"] = $userData["id"];
exit;
}
}
}
$userIsLoggedIn = isset($_SESSION["userId"]) ? true : false;
$userId = $_SESSION["userId"];
if ($userIsLoggedIn){
echo "Es ist der Benutzer mit der ID $userId angemeldet.";
}
else{
echo "Es ist kein Benutzer angemeldet.";
}
Zwischen etaigen Fehlermeldungen beim Login und einem simplen "nichteingeloggtsein" wird hier nicht unterschieden. Dazu könnete man eine weitere Sessionvariable
$_SESSION["error"] setzen, die festhält, ob passwort oder benutzername falsch waren etc.
Um die Session bei einem logout zu beenden dient dann der Befehl
session_destroy();. Die aktuelle Session wird zerstört, ein Redirect wird gestartet und die Ausführung weiterer Befehle mit
exit; verhindert.
Code:
session_destroy();
header("Location: http://".$_SERVER["HTTP_HOST"]);
exit;
Ich hoffe, ich konnte dir helfen.
session_destroy(); ;-)
huckepick