Geschrieben von brain_surgery am 03.04.2011 um 15:00:
Login mit PHP und Sessions v.2 | Extra: Login mittels WBB-Forum-Accounts
Ich habe einen Fehler im Skript ausgebessert, der dazu führte, dass das Einloggen nicht möglich war! Es sollte jetzt einwandfrei funktionieren.
@Mods: Bitte verschieben!
Login mit PHP und Sessions - Tutorial
Hallo Leute!
Vorwort:
So, hier nun die überarbeitete Version meines Login-Tutorials. Ich habe den Code reichlich mit Kommentaren versehen, das Anpassen sollte also ein Kinderspiel sein. Außerdem habe ich den ganzen Loginprozess auf eine Datei zusammengeschrumpft, das heißt login.php und login_action.php sind nun nicht mehr seperat.
Das Skript läuft noch ungetestet, also bitte sagt bescheid, wenn etwas nicht funktioniert und traut euch ruhig, Fragen zu stellen!
Ich habe außerdem beschlossen, das neue Tutorial in einen neuen Thread zu packen, damit das alte erhalten bleibt, das wesentlich genauer auf den Code eingeht. Dieses hier ist eher eine Plug&Play-Version, das heißt man lädt sich den Code runter und ersetzt ein paar Variablen, dann ist das Ganze auch schon einsatzbereit.
Ganz unten findet ihr auch einen Extra-Teil, der kurz erklärt, was ihr an diesem Skript abändern müsst, damit ihr eure Homepage mit einem WBB-Forum verbinden könnt - und die User sich nur auf dem Forum registrieren müssen damit sie sich auch auf der Homepage einloggen können!
Vorraussetzungen:
Um dieses Tutorial umzusetzen benötigst du einen PHP- und MySQL-fähigen Webspace mit FTP und Datenbank. Beispiele dafür sind funpic, square7 oder bplaced (<-mein persönlicher Favorit). Außerdem ein Programm, dass Dateien mit der Endung .php speichern kann. (Das klingt jetzt vll aufregend und ungewohnt, aber im Grunde kannst du jede Datei mit der Endung .html oder .htm genausogut mit .php abspeichern. Das ist sogar vorteilhaft und für dieses Tutorial unbedingt nötig!) Im Normalfall reicht dafür der normale Standard-Editor, den Windows von Werk ab mitbringt. Auch solltest du wissen, wie man Dateien auf einen Webserver lädt (also FTP verwendet)!
Benötigte Dateien:
Ich hänge alle Dateien am Ende des Posts an, damit ihr sie gleich fertig herunterladen könnt. Der Code wird hier im Tutorial aber besprochen! Einige Daten müssen auch abgeändert und angepasst werden, damit die Codes funktionieren!
Los gehts!
1.: Die Vorbereitung der Datenbank
Ganz unten in der Übersicht deiner Datenbank in phpMyAdmin findest du das Feld zum Erstellen neuer Tabellen. Fülle es aus wie im Screenshot gezeigt und klicke auf "OK".
Beim Erstellen der neuen Tabelle muss es also so aussehen (Ich habe hier nur die nötigsten Felder erstellt. Im Laufe der Zeit wirst du vielleicht noch weitere Felder hinzufügen wollen):
Die Felder können bei dir auch horizontal angeordnet sein, in dem Fall ist es aber genau das Selbe! Wenn du alles wie im Bild ausgefüllt hast, klicke auf "Speichern". (Nicht auf "OK"!)
Wir haben jetzt die nötigen Felder angelegt. Der Login würde nun aber noch nicht funktionieren, weil die Tabelle ja noch leer ist und keine Informationen zu Mitgliedern enthält! Darum wollen wir zu Testzwecken einmal dich selbst quasi als Administrator manuell eintragen.
Dazu klickst du nun ganz links, wo die Übersicht deiner Datenbank ist, auf den Namen deiner neu angelegten Tabelle. (In diesem Fall vermutlich "mitglieder".)
phpMyAdmin zeigt dir jetzt die Struktur der Tabelle an. Um einen neuen Datensatz einzufügen, klicke auf die Registerkarte "Einfügen" über der Tabellenstruktur.
Du füllst nun einfach die Felder mit den gewünschten Daten aus. "id" kann freigelassen werden, da wir vorhin beim Erstellen mit der Eigenschaft "auto_increment" bestimmt haben, dass die Datenbank diesem Feld automatisch einen steigenden Wert zuweisen soll. Klicke auf "OK" und der Datensatz wird gespeichert. (Wenn du willst, kannst du nun auf die Registerkarte "Anzeigen" klicken, um dir den Inhalt der Tabelle anzusehen.
Das wars soweit von Seiten der Datenbank! Jetzt gehts ans Programmieren.
2.: Die login.php
Damit sich der User einloggen kann, braucht er ein Formular, in das er seine Daten eingeben kann. Das kann ganz simpel gestaltet oder aufwändig mit Tabellen und Grafiken verziert sein, aber die Datenbank interessiert das nicht wirklich.
Die login.php besteht dabei grob aus zwei Teilen:
Dem Formular und dessen Verarbeitung.
Ihr könnt den HTML-Teil beliebig verzieren, wichtig ist aber, dass ihr folgendes im Code ersetzt (Zeile 5 bis 12 in der Datei):
php: |
1:
2:
3:
4:
5:
6:
7:
8:
|
//////////////////////
//Hier müssen die Links zu deinen Seiten eingetragen werden!
//////////////////////
$loginseite = "DEINEADDY"; //URL zu deiner Loginseite
$internseite = "DEINEADDY"; //URL zu deiner internen Seite
////////////////////// |
|
Wie schon in den Kommentaren erwähnt musst du hier die (relativen) Adressen eintragen, über die die jeweiligen Seiten auf deinem Webspace erreichbar sind. Den Rest macht das Skript für dich!
3.: Die datenbank.php
Die nächsten Dateien, die wir erstellen wollen, müssen mit der Datenbank interagieren. Damit das möglich ist, muss die Datei sich zuerst einmal mit jeder verbinden. Das geschieht in einer eigenen Datei, auf die dann immer wieder zugegriffen wird.
php: |
1:
2:
3:
4:
5:
|
// Verbindungsdaten
$sqlhost = "localhost"; //bei funpic, bplaced etc. ansonsten musst du den Host bei deinem Anbieter nachschauen!
$sqluser = "DEINBENUTZERNAME";
$sqlpassword = "DEINPASSWORT";
$sqldb = "DEINEDATENBANK"; |
|
Du musst nur DEINBENUTZERNAME, DEINPASSWORT und DEINEDATENBANK einfüllen. Es sind die selben Werte, mit denen du dich auch mit phpmyadmin verbindest und sie können in der Regel bei deinem Webspace Anbieter nachgelesen werden.
Wenn alle Verbindungsinformationen ermittelt sind, werden sie im zweiten Teil des Codes dafür verwendet, die Verbindung zu öffnen. Hier brauchst du nichts abzuändern!
Die Datei alleine bewirkt noch nicht viel. Sie stellt ja nur eine Verbindung her. Darum wird sie von unseren anderen Dateien sozusagen als "Helferlein" verwendet, damit du die Daten nicht jedesmal neu eingeben musst.
Damit hätten wir den Loginprozess abgeschlossen! Wenn alles so weit geklappt hat, kann sich der User jetzt einloggen. Aber wir sind noch nicht ganz fertig. Denn woher weiß die Seite nun, welche Seite nur für eingeloggte Mitglieder ist und welche nicht?
Hierfür brauchen wir eine weitere Datei.
4.: Die checkuser.php
Wir verwenden die Sessions nicht zum Spaß. Mithilfe von ihnen und eines ganz simplen Tricks kann man mit nur einer Zeile Code eine Seite logingeschützt machen.
Aber damit das funktioniert, müssen wir die Datei "
checkuser.php" aufrufen.
Hier muss wie auch schon in login.php nur ein Pfad zu einer Seite, in diesem Fall dem Loginformular, angepasst werden:
php: |
1:
|
$loginseite = "DEINEADDY"; //URL zu deiner Loginseite |
|
In dieser Datei prüfen wir, ob die Sessionvariable "name" gesetzt ist. (Das passiert wenn sich der User einloggt.) Ist dies der Fall, dann tun wir einfach nichts, lassen den User also passieren.
Ist sie nicht gesetzt, dann bedeutet dass, das jemand, der nicht eingeloggt ist, versucht auf die Seite zuzugreifen. In diesem Fall tritt dieses kleine Skript in Aktion und gibt eine Meldung mit dem Link zur Loginseite aus. Außerdem blockiert es mit "exit;" dass ab diesem Punkt irgendein weiterer Code verarbeitet wird. Platzieren wir also dieses Skript auf einer internen Seite, und ein uneingeloggter User will zugreifen, dann wird die Seite nicht geladen sondern nur diese Meldung angezeigt!
Du könntest nun theorethisch diesen Code nehmen und auf jede deiner internen Seiten kopieren. Weil Programmierer aber bekanntlich faul sind, machen wir es wie zuvor schon, indem wir ganz oben auf allen Seiten, die geschützt sein sollen, per "include("...")" diese Datei einfügen.
Eine interne Seite könnte also zum Beispiel so aussehen:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|
<?php
include("checkuser.php");
?>
<html>
<head>
<title>Interne Seite</title>
</head>
<body>
Diese Seite ist nur für Mitglieder zugänglich!
</body>
</html> |
|
5.: Letzter Schritt: Die logout.php
Wir sind nun so gut wie fertig. Wir haben eine Login-Seite und die Prüfung. Jetzt fehlt nur mehr eines: Die Möglichkeit, dass sich der User auch wieder ausloggen kann!
Das wird auf der Seite "
logout.php" erledigt, die ganz normal über einen Link aufgerufen werden kann.
Diese Seite kann wieder nach Herzenslust angepasst werden, unbedingt müssen aber wieder die URLs eingetragen werden:
php: |
1:
2:
|
$loginseite = "DEINEADDY"; //URL zu deiner Loginseite
$indexseite = "DEINEADDY"; //URL zu deiner Startseite |
|
Geschafft!
Hast du bis hierher alles richtig gemacht und eine gewogene Glücksfee, dann sollte nun alles einwandfrei funktionieren. Wenn nicht, dann versuche ich natürlich gerne zu helfen!
Was in diesem Tutorial nicht behandelt wurde, ist wie neue Mitglieder dynamisch in die Datenbank eingetragen werden können. Mit etwas Fantasie lassen sich aber andere Tutorials leicht abwandeln!
Im Anschluss hier noch ein paar nützliche Links, die bei eventuellen Fragen hilfreich sein können:
Datenbank aufsetzen - Bezüglich dem Erstellen von Tabellen und Datenbankeinträgen
Referenz für Formulare
Der SELECT-Befehl
Der echo-Befehl
Umfassendes PHP Tutorial von mir - Wie der Name schon sagt
User-Registration - ebenfalls von mir, passend zu dem Login
Extra-Teil: Login mit WBB-Forum-Accounts
Wenn ihr zusätzlich zu eurem WBB-Forum auch eine Homepage auf eurer Seite haben wollt, wäre es umständlich, wenn die Mitglieder sich dort extra noch einmal registrieren müssten. Im Folgenden habe ich deswegen eine kleine Anleitung zusammengestellt, wie ihr mein Login-Skript ganz leicht anpassen könnt, um so ein Vorhaben zu verwirklichen. (Sogar im Stil einer Hack-Anleitung! Whee! :
D)
Diese Version ist getestet mit WBBLite 1.2, ob es mit anderen funktioniert weiß ich leider nicht, aber mit ein wenig Glück müssten die Datenbankeinträge die selben sein.
1. config.inc.php
Diese Datei findet ihr bei den Dateien eures Forums im Verzeichnis acp/lib/.
Sie ersetzt bei dieser Version die datenbank.php.
Füge am Ende der Datei (vor ?>) ein:
php: |
1:
2:
|
mysql_connect($sqlhost,$sqluser,$sqlpassword) or die ("Fehler beim Verbinden mit der Datenbank!");
mysql_select_db($sqldb) or die ("Die Datenbank existiert nicht"); |
|
2. login.php
Suche:
php: |
1:
|
include("datenbank.php"); |
|
Ersetze mit:
php: |
1:
|
include ("config.inc.php"); |
|
Suche:
php: |
1:
|
$passwort = $_POST["password"]; |
|
Ersetze mit:
php: |
1:
|
passwort= md5($_POST["passwort"]); |
|
Suche:
php: |
1:
|
$query = mysql_query("SELECT name, passw FROM mitglieder WHERE name = '".$username."' AND passw = '".$passwort."' LIMIT 1"); |
|
Ersetze mit:
php: |
1:
|
$query = mysql_query("SELECT userid, username, password, groupid FROM bb".$n."_users WHERE username = '".$username."' AND password = '".$passwort."'"); |
|
Suche:
php: |
1:
|
$_SESSION["name"] = $username; |
|
Ersetze mit:
php: |
1:
2:
3:
4:
5:
|
$_SESSION["login"] = array (
'id' => $login["userid"],
'username' => $login["username"],
'gruppe' => $login["groupid"]
); |
|
Statt einem Wert wird jetzt in die Sessionvariable gleich ein ganzes Array von Werten gespeichert.
Die ID des Users, abrufbar über
$_SESSION["login"]["id"]
Der Name des Users, abrufbar über
$_SESSION["login"]["username"]
Die ID der Gruppe des Users (zB. Admin), abrufbar über
$_SESSION["login"]["gruppe"]
3. checkuser.php
Suche:
php: |
1:
|
if(!isset($_SESSION["name"])) |
|
Ersetze mit:
php: |
1:
|
if(!isset($_SESSION["login"])) |
|
Das wars! Jetzt ladet die Dateien (login.php, config.int.php, checkuser.php, logout.php) noch wie gewohnt auf den Webspace. Zumindest login.php und config.inc.php sollten dabei im selben Verzeichnis liegen.
4. Problemlösungen
Es können einige Fehler auftreten, je nach Aufbau der Seite.
Zitat: |
Warning: session_start() [function.session-start]: Cannot send session cookie |
Das passiert, wenn die Zeile session_start(); nicht als allererstes gleich nach <?php auf der Seite steht.
1. Fall:
Wenn ihr das Skript für eine Seite, in der der Header erst bei der Ausgabe hinzugefügt wird übernehmt, dann müsst ihr aus den Dateien checkuser.php, login.php und logout.php das session_start(); herauslöschen und ganz zuerst in die Datei, die euren Header beinhaltet, einfügen.
2. Fall:
Ansonsten kann nur sein, dass etwas vor dieser Zeile steht. Sogar ein Zeilenumbruch ist zuviel! Kontrolliert ganz genau euren Code, dann sollte der Fehler auffindbar sein.
lg und bis zum nächsten Mal, brain