PHP

Login-System mit PHP und MySQL (PHP Tutorial)

Tutorial erstellt von SilentStormer, letzte Änderung am 29.11.2008

Hier werde ich euch möglichst verständlich erklären, wie man ein Login-System mit Hilfe von PHP und MySQL bastelt.
Dies sollte Benutzer und deren Passwörter aus der Datenbank auslesen und überprüfen, ob die Eingaben mit einer Datenzeile übereinstimmen. Wenn der Login erfolgreich war, bleibt man so lange eingeloggt (und kann sich damit auch im passwortgeschützten Bereich bewegen), bis man sich ausloggt oder die Session abgelaufen ist.

Bevor wir anfangen können, muss eine Datenbank vorhanden sein, auf die ihr zugreifen könnt.
Jetzt erstellen wir erstmal eine Tabelle für Username und Passwort.
Fügt dazu einfach in phpmyadmin (oder wo immer ihr auch arbeitet) folgenden SQL-Code ein:

Code:
CREATE TABLE `login` (
  `id` int(11) NOT NULL auto_increment,
  `name` text NOT NULL,
  `pwd` text NOT NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO `login` VALUES (1, 'admin', 'login');


Jetzt haben wir die Tabelle 'login' und 3 Spalten ('id', 'name' und 'pwd') angelegt.
Außerdem müsste jetzt bereits eine Datenzeile vorhanden sein mit den Werten '1', 'admin', und 'login'. Um später euer Script zu testen, könnt ihr euch mit dem Usernamen 'admin' und dem passwort 'login' anmelden.

Fangen wir an.
Als erstes brauchen wir eine Datei, die wir in jede Datei inkludieren, um auf die Datenbank zugreifen zu können.

Wir nennen sie "mysql_connectinfo.php".

Code:
<?php

   $mysqlhost="localhost";
   $mysqluser="username";
   $mysqlpasswd="passwort";
   $mysqldbname="datenbankname";
   $mysqltable="login";
   $mysqlpwd="pwd";
   $mysqlname="name";

   $link = @mysql_pconnect($mysqlhost, $mysqluser, $mysqlpasswd);
   if ($link == FALSE) {
     echo "<p><b>Leider kann keine Verbindung zur Datenbank hergestellt werden.";
     echo "Bitte versuchen Sie es später noch einmal.</b></p>\n";
     exit();
   }
   mysql_select_db($mysqldbname);

?>




In den ersten Zeilen weisen wir 4 einzelnen Variablen den Hostname, den Usernamen, das Passwort und den Datenbanknamen zu. Die anschließenden drei Zeilen werden dazu benützt, um die Tabelle (wo Name und Passwort der User drinstehen, die Zugangsberechtigung zum Login-Bereich haben) und die zwei darin liegenden Spalten zu benennen (Name und Passwort). Sie müssen ident mit denen in deiner Datenbank sein, da sonst kein Login erfolgen kann.

Mit dem Befehl

Code:
$link = @mysql_pconnect($mysqlhost, $mysqluser, $mysqlpasswd);


connecten wir uns mit der Datenbank. Wenn die Verbindung steht, erhält die Variable '$link' den Wert 'true', ansonsten 'false'.

Als nächstes fragen wir ab, ob '$link' false ist. Wenn sie das ist, wird eine Fehlermeldung ausgegeben und das Script beendet.

   Code:
if ($link == FALSE) {
     echo "<p><b>Leider kann keine Verbindung zur Datenbank hergestellt werden.";
     echo "Bitte versuchen Sie es später noch einmal.</b></p>\n";
     exit();
   }



Ansonsten läuft das Script weiter.
Mit dem Befehl

Code:
mysql_select_db($mysqldbname);



wählen wir nun die oben in der Variable '$mysqldbname' definierte Datenbank aus. Somit ist die Verbindung erfolgreich hergestellt und wir können alle Tabellen, Zeilen und Spalten, die sich in der Datenbank befinden, verwenden.

Jetzt haben wir die Datei "mysql_connectinfo.php" fertig.

Wenden wir uns also an das Hauptscript - nämlich der Anmeldung.
Legen wir eine neue Datei an und nennen sie 'login.php'.

Zunächst einmal der komplette Quelltext. Ich werde ihn nachher einzeln erklären.

Code:
<?php

  session_start();

  include "mysql_connectinfo.php";

  if (isset($_SESSION['angemeldet']) || $_SESSION['angemeldet']) {
    header('Location: login-index.php');
    exit;
  }

  else if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    $username = $_POST['username'];
    $passwort = $_POST['passwort'];

    $sql = mysql_query("SELECT $mysqlname FROM $mysqltable WHERE $mysqlname='$username' AND $mysqlpwd='$passwort'");
    $num = mysql_num_rows($sql);

    if ($num != 0) {
      $_SESSION['angemeldet'] = true;

      if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
        if (php_sapi_name() == 'cgi') {
          header('Status: 303 See Other');
        }
        else {
          header('HTTP/1.1 303 See Other');
        }
      }

      header('Location: login-index.php');
      exit;
    }
    else {
      echo "<p><b>Falsche Login-Daten!!</b></p>n";
    }
  }
?>
    <form action="login.php" method="post">
      <table border="0">
        <tr>
          <td>Username:</td>
          <td><input type="text" name="username" /></td>
        </tr>
        <tr>
          <td>Passwort:</td>
          <td><input type="password" name="passwort" /></td>
        </tr>
        <tr>
          <td> </td>
          <td><input type="submit" value="Einloggen" /></td>
        </tr>
      </table>
    </form>



Mit dem Befehl

Code:
session_start();


Starten wir die Session (diese muss auf jeder einzelnen Seite im Login-Bereich gestartet werden).

Anschließend inkludieren wir mit

Code:
include "mysql_connectinfo.php";


die vorhin erstellte Datei. Somit können wir auf die Datenbank zugreifen.

Dann kommen wir zu folgendem Codestück:

  Code:
if (isset($_SESSION['angemeldet']) || $_SESSION['angemeldet']) {
    header('Location: login-index.php');
    exit;
  }



Hier wird abgefragt, ob wir uns bereits angemeldet haben. Wenn ja, dann geschieht eine Weiterleitung zu der Index-Seite des Login-Bereiches. Das Script wird durch 'exit;' nicht mehr weiter ausgeführt.

Wenn wir noch nicht eingeloggt sind, dann fragt er weiters ab, ob die Anfragemethode des Servers ('$_SERVER['REQUEST_METHOD']') durch ein Formular aufgerufen wird ('POST' steht meistens für ein Formular, allerdings muss dies definiert werden. Zu dem kommen wir aber erst).

Code:
  else if ($_SERVER['REQUEST_METHOD'] == 'POST') {



Wenn dies der Fall ist, dann definieren wir zwei neue Variablen mit den Übergabeparametern aus dem Formular. (auch hier kommt wieder 'POST' vor). Diese Übergabeparameter beinhalten Username und Passwort, welche der User im Formular eingegeben hat.

    Code:
$username = $_POST['username'];
    $passwort = $_POST['passwort'];



Als Nächstes wählen wir die Zeile aus der Datenbank aus, die mit den eingegebenen Daten des Users ident sind und weisen diese der Variablen '$sql' zu.
Dann definieren wir eine neue Variable '$num'. In diese speichern wir die Anzahl der Zeilen, die durch vorigen Befehl selektiert worden ist. Da wir nur einen Eintrag mit dem gleichen Passwort und dem gleichen Namen haben werden (Login erfolgreich) oder es gar keinen Eintrag mit diesem Namen und diesem Passwort gibt (Login gescheitert), ist in der Variablen '$num' entweder 0 oder 1 gespeichert.

    Code:
$sql = mysql_query("SELECT $mysqlname FROM $mysqltable WHERE $mysqlname='$username' AND $mysqlpwd='$passwort'";
    $num = mysql_num_rows($sql);



Jetzt überprüfen wir den Inhalt von '$num'. Wenn er nicht 0 ist, dann gibt es in der Datenbank einen Eintrag für den User, der sich gerade anmelden wollte. Wir lassen ihn also in den Login-Bereich eintreten. Deshalb setzen wir die Session 'angemeldet' auf true.

    Code:
if ($num != 0) {
      $_SESSION['angemeldet'] = true;



Folgendes Codestück dient dem Server nur zur Orientierung, mit welchem Protokoll sich der User gerade anmeldet und braucht euch deshalb nicht zu kümmern. Einfach einfügen :)

      Code:
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
        if (php_sapi_name() == 'cgi') {
          header('Status: 303 See Other');
        }
        else {
          header('HTTP/1.1 303 See Other');
        }
      }



Da wir nun schon die Richtigkeit der Eingaben überprüft haben, können wir die Weiterleitung auf die Startseite des Login-Bereichs zulassen.
Wiederum beenden wir mit 'exit;' das Script.

      Code:
header('Location: login-index.php');
      exit;
    }
  }



Wenn keine Datenbankzeile ausgewählt wurde, gehen wir davon aus, dass der User falsche Angaben gemacht hat und geben eine Fehlermeldung zurück.

    Code:
else {
      echo "<p><b>Falsche Login-Daten!!</b></p>\n";
    }


Wir beenden das Script noch nicht, da er die Möglichkeit haben sollte, sich nocheinmal einzuloggen. Also läuft das Script weiter und wir geben das Anmeldeformular aus.

Auch wenn wir noch nicht angemeldet sind oder die Seite das erste mal betreten wird, erscheint das Anmeldeformular.

    Code:
<form action="login.php" method="post">
      <table border="0">
        <tr>
          <td>Username:</td>
          <td><input type="text" name="username" /></td>
        </tr>
        <tr>
          <td>Passwort:</td>
          <td><input type="password" name="passwort" /></td>
        </tr>
        <tr>
          <td> </td>
          <td><input type="submit" value="Einloggen" /></td>
        </tr>
      </table>
    </form>



In der ersten Zeile wir die aufzurufende Seite und die Methode des Formulars deklariert. Die aufrufende Seite ist die selbe Seite, also schreiben wir dort auch den selben Namen rein. Die Methode ist 'POST' (siehe weiter oben bei den Übergabeparametern). Wir könnten sie auch als 'GET' definieren. Da GET aber hauptsächlich für die Parameterübergabe per URL steht, habe ich hier POST verwendet.

Bei 'Username' und 'Passwort' brauchen wir das Attribut 'name', um aus dem Formular den Inhalt des eingegebenen Texts dem weiterverarbeitenden Script zu übergeben (zur Erinnerung: $username = $_POST['username']; <-- $_POST beschreibt die Methode und ['username'] muss mit dem Attribut 'name' im Formular übereinstimmen, um die Übergabe zur Variablen '$username' zu vollziehen).

'type' dient zur Definition, was denn nun eigentlich eingegeben wird. Der Username ist normaler Text. Das Passwort jedoch muss als type="password" definiert werden, sonst wird das Eingegebene für jeden lesbar angezeigt. Mit dieser Typendeklaration jedoch sieht man während der Eingabe nur '******'.


So, hiermit hätten 'login.php' auch fertig.
Wir sind aber noch nicht ganz fertig.

Wir brauchen nun noch eine Datei, die wir auf jeder Seite, die nur sichtbar sein soll, wenn man eingeloggt ist, inkludieren können.
Legt dazu eine neue Datei an und nennt sie 'auth.php'.


Code:
<?php

  session_start();

  if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
    header('Location: login.php');
    exit;
  }

?>



Das wars auch schon wieder. Es wird lediglich eine neue Session gestartet und anschließend abgefragt, ob man eingeloggt ist. Wenn man eingeloggt ist, wir die Seite, auf der 'auth.php' inkludiert wird, ganz normal angezeigt. Wenn man jedoch die Seite abfragen will, ohne sich angemeldet zu haben, wird man automatisch auf das Anmeldeformular weitergeleitet und das Script beendet.


Halt!! Eine Datei fehlt uns jetzt noch. Wir müssen uns doch schließlich auch irgendwie ausloggen können.
Also - neue Datei anlegen, 'logout.php' nennen und Folgendes einfügen:

Code:
<?php

     session_start();
     session_destroy();

     header('Location: login.php');

?>



Wir starten die Session und zerstören sie gleich darauf wieder?? Kurios, muss aber sein. Mit
Code:
session_destroy();

wird die aktuelle Session endgültig und unwiederruflich zerstört. Danach erfolgt eine Weiterleitung zum Anmeldeformular. Die Weiterleitung ist natürlich beliebig veränderbar.
Das Script brauchen wir diesmal nicht händisch zu beenden, da es sowieso schon aus ist nach der Weiterleitung.


Das wars im Großen und Ganzen. Ich zeige euch jetzt noch, wie beispielsweise 'login-index.php' aussehen könnte (also eine Datei, die nur gesehen werden kann, wenn man eingeloggt ist).

Code:
<?php   include "auth.php";   ?>
   <p>Willkommen im neuen Admin-Bereich dieser Homepage!!</p>
   <p> <p>
   <p>Viel Spaß noch!</p>



In der ersten Zeile wird 'auth.php' inkludiert, der Rest ist eine ganz normale HTML Datei (erfordert jedoch ebenfalls die Endung '.php').
Versucht jemand, per URL diese Datei aufzurufen, wird er automatisch auf 'login.php' zurückgeleitet und aufgefordert, sich einzuloggen.


Ich hoffe, ich habe auch das verständlich erklärt und freue mich über Feedback.

MfG SilentStormer

Hier zeige ich euch, wie man ein Login-System baut. Ich habe es ausreichend kommentiert, sodass es auch für Anfänger zu verstehen sein dürfte.


>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!

Impressum / Datenschutzerklärung          © der-Webdesigner.net 2002 - 2011           top ▲