Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Login-System No.2
Thema geschlossen
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 24.03.2007, 12:28 Nach oben    #1
Oliver O.
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 475
Standard [PHP] Login-System No.2

Hi,

Nachdem dieser Thread hier gepostet worden ist und ich meinte, ich hätte einen Login-Skript, der gut zum Template-System von Covin passt, hab ich jetzt mal meinen Skript als Tutorial umgeschrieben.

Grundüberlegung: Was soll das Skript können.
Ja, klar! Es soll User einloggen oder auslogen. Aber so einfach ist es nicht.
Da gibt es mehrere Möglichkeiten so was umzusetzen...
Aber ich find am praktischen eine Datenbank zu benutzen, um die Userdaten zu verwalten, und eine Session, um später den login-Status heraus zu finden.

Und die Datenbank sieht so aus:
-Id //Um den User zweifelsfrei zu identifizieren
-Name //Eben so wie die Id gibt es den Namen nur einmal
-Password //Ist klar wofür
-first_login //Anmeldedatum
-last_login //Datum an dem der User zuletzt online war

Die Tabelle nenne ich "login_user", und so sieht das ganze in MySQL aus:
Code:
CREATE TABLE `login_user` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR( 24 ) NOT NULL ,
  `password` VARCHAR( 32 ) NOT NULL ,
  `first_login` DATETIME NOT NULL ,
  `last_login` DATETIME NOT NULL ,
  UNIQUE (
    `id`, `name`
  )
) ENGINE = MYISAM ;
Jetzt zu dem eigentlichen Loginskript.
Ich teil das Skript in 5 Dateien auf, damit der Umgang leichter ist.
-login.action.php //Übernimmt alles was mit Login oder Logout zu tun hat (so zu sagen das Herz diese Scriptes)
-login.form.php //Zum späteren einbinden des Loginfeldes
-login.functions.php //Alle wichtigen Funktionen für andere Seiten
-login.register.php //Zum Anmelden

Wo fangen wir an? Am besten bei der login.action.
Die sieht so aus:
PHP-Code:
<?php
session_start
();

//Alle nötigen Funktionen importieren
include_once('login.functions.php');
//SQL-Einstellungen importieren
include_once('config.sql.php');
//Namen auslesen

$name strip_tags($_POST['name']);
//Password auslesen
$pass md5(strip_tags($_POST['pass']));

//Hat sich wirklich jemand versucht sich ein zu loggen? 
if(!empty($name))
{
  
//Mit Datenbank verbinden
  
mysql_connect($host,$user,$password);
  
//Datenbank auswählen
  
mysql_query("USE $database");
  
//MySQL-Abfrage vorbereiten
  
$q "SELECT * FROM `$usertable`WHERE `name` = '".mysql_real_escape_string($name)."' AND" " `password` = '".mysql_real_escape_string($pass)."';";
  
//Abfrage Ausführen
  
$result mysql_query($q);
  
//Da es maximal einmal den angegeben Namen gibt, gibt es auch nur max. eine Zeile im SQL-Result
  
$user mysql_fetch_row($result);
  
//Gibt es einen User mit dem Namen und dem Passwort?
  
if(!empty($user))
  {
    
//Wenn ja, ist er online
    
$_SESSION['online'] = true;
    
//und wir tragen alle bekannten Userinfos in die Session ein
    
$_SESSION['user'] = $user;
    
//Jetzt wird noch in der Datenbank das Datum von Heute eingetragen
    
$q "UPDATE `$usertable` SET `last_login` = NOW() WHERE `$usertable`.`id` =" $user[0] ." LIMIT 1 ;";
    
mysql_query($q);
  }
}
else
{
  
//gibt es keinen Username, dann möchte sich der User abmelden 
  
user_logout();
}
//Und ab nach Hause!
header('Location: '.$_SESSION['path'].'/index.php');
?>
Ich glaube, es ist sehr selbsterklärend... aber was ist eigentlich config.sql.php?
Bei mir sieht sie so aus:
PHP-Code:
<?php
$host 
"localhost";
$user "[USER]";
$password "[PASSWORD]";
$database "[DATENBANK]";
$usertable "login_user";
?>
Aber wir haben noch login.functions.php eingebunden, und ohne die, gibt es einen Fehler beim aufrufen von user_logout()...
Und hier ist sie:
PHP-Code:
<?php
session_start
();
//Wenn diese Datei eingebunden wurde, dann wird überprüft, ob man online ist
check_login_actions();
/*
Überprüft, ob man online ist, und ob man hier eigentlich sein darf
*/
function check_login_actions()
{
  
/*
  Ist man online?
  $_GET['remove'] = Soll User gelöscht werden?
  */
  
if(isOnline() && !empty($_GET['remove'])
  ){
    if(
$_POST[$_SESSION['delete_code']] == "on"//$_SESSION['delete_code'] ist zur Sicherheit, damit es schwerer ist fremde Benutzer zu löschen. Es ist der Name der Checkbox die man beim Löschen braucht.
    
{
      
$user $_SESSION['user'];
      
user_remove($user[0],$user[1],$user[2]); //User löschen!
    
}
  }
  
//Soll User ausgelogt werden?
  
if(!empty($_GET['logout']))
  {
      
$_SESSION['online'] = false;
  }
  
//Wenn NEED_LOGIN definiert wurde, dann darf man nur hier sein, wenn man online ist.
  
if(defined("NEED_LOGIN") && !isOnline())
  {
    
//Wenn man es nicht ist, dann ab nach Hause!
    
header('Location: '.$_SESSION['path'].'/index.php?error=1');
  }
}

/*
Rückgabewert:
True - Wenn online
False - Wenn nicht
*/
function isOnline(){
  if(
is_bool($_SESSION['online'])) {
    return 
$_SESSION['online'];
  }
  return 
false;  
}
/*
User löschen
*/
function user_remove($id$name,$pass)
{
  
//Verbindung zur Datenbank
  
include_once('config.sql.php');
  
mysql_connect($host,$user,$password);
  
mysql_query("USE $database");
  
//Query vorbereiten
  
$q "DELETE FROM `$usertable`WHERE id = $id AND name='$name' ;";
  
//Und User löschen
  
mysql_query($q);
  
//Session lehren
  
user_logout();
}
/*
User ausloggen
*/
function user_logout()
{
  
//Alle Datein aus der Session löschen.
  
session_destroy();
  
//Zurück zur Startseite; könnte ja sein, das dies ein geschützter Bereich ist!
  
header('Location: '.$_SESSION['path'].'/index.php');
  exit();
}
/*
Überprüfen, ob es irgendwo eine Fehlermeldung über GET gibt
*/
function checkError()
{
  
$error $_GET['error'];
  switch(
$error)
  {
  case 
1:
    echo 
"Sie sind nicht eingelogt<br>";
    
getLoginForm();
  }  
}
?>
Hier könnte man weitere Funktionen anhängen, die auf die Userdatein eingehen, wie z.B. getUserID() oder getUserName(), usw.
Ich brauch das nicht.

So. Jetzt könnten wir uns doch schon einloggen, oder? Rein theoretisch schon, aber ohne Loginfeld ist es noch sehr schwer, deshalb hier die Datei login.form.php.
Diese ist so aufgebaut, dass man später weniger Schwierigkeiten hat, sie in die Homepage zu integrieren. Deshalb ist sie so groß.
PHP-Code:
<?php
session_start
();
//Für die Funktion "isOnline()"
include_once('login.functions.php');

/*
$login_form_size = alles in einer Linie, oder bisschen aufgeblasener? Und wozu soll das Feld dienen; zum einloggen, oder zum Registrieren?

Rückgabewert:
Wenn $echo == false:
 Den HTML-Code fürs Login-Feld
Sonst:
 NULL (HTML-Code wird direkt ausgegeben)
*/
function getLoginForm($login_form_size ""$echo false)
{
  
$return "";
  if(
$login_form_size == "regist_small" || $login_form_size == "regist")
  {
    
$return "<form action=\"login.regist.php\" method=\"post\">
      <input type=\"text\" name=\"name\">
      <input type=\"password\" name=\"pass\">
      <button>
       Regist
      </button>
    </form>"
;
  }
  else if(
$login_form_size == "regist_large")
  {
    
$return "<form action=\"login.regist.php\" method=\"post\">
      <label>Name:</label><input type=\"text\" name=\"name\"><br />
      <label>Passwort:</label><input type=\"password\" name=\"pass\"><br />
      <button>
       Regist
      </button>
    </form>"
;
  }
  else if(
$login_form_size == "delete")
  {
  
$_SESSION['delete_code'] = rand(0,1000); //Zum späteren feststellen der Richtigkeit der Löschung
  
$return "<form action=\"index.php?remove=1\" method=\"post\">
      <input type=\"checkbox\" name=" 
$_SESSION['delete_code'] . ">
      <button>L&ouml;schen</button>
    </form>"
;
  }
  else if(
isOnline())
  {
    
$return '<a href="login.action.php">Logout</a>';
  }
  else if(
$login_form_size == "large")
  {
    
$return "<form action=\"login.action.php\" method=\"post\">
      <label>Name:</label><input type=\"text\" name=\"name\"><br />
      <label>Passwort:</label><input type=\"password\" name=\"pass\"><br />
      <button>
       Login
      </button>
    </form>"
;
  }
  else
  {
    
$return "<form action=\"login.action.php\" method=\"post\">
      <input type=\"text\" name=\"name\">
      <input type=\"password\" name=\"pass\">
      <button>
       Login
      </button>
    </form>"
;
  }
  if(
$echo == true)
  {
    echo 
$return;
  }
  else
  {
    return 
$return;
  }
}
?>
Ist, da ich finde, dass es sehr selbsterklärend ist, nur wenig Kommentiert...

Aber jetzt können wir uns doch einloggen oder?
Klar, aber die Datenbank ist noch sehr leer...
PHP-Code:
<?php
session_start
();
//SQL-Einstellungen
include_once('config.sql.php');

$name strip_tags($_POST['name']);
$pass md5(strip_tags($_POST['pass']));

//Gibt es jemanden der sich HIER registrieren will? Ein Wunder ;-)
if(!empty( trim$name ) ) && !empty( (trim$pass )) ))
{
  
//Datenbankverbindung aufbauen
  
mysql_connect($host,$user,$password);
  
mysql_query("USE $database");
  
//Abfreage vorbereiten
  
$q "INSERT INTO `$usertable` ( `id` , `name` , `password` , `first_login` , `last_login` )
  VALUES (
    NULL , '"
.($name)."', '".($pass)."', NOW(), NOW()
  );"
;
  
//Und neuen User Willkommen heißen
  
$result mysql_query($q);
  
header('Location: '.$_SESSION['path'].'login.action.php');
  exit();
}
?>
Jetzt haben wir alles. Aber trotzdem geht es nicht??
Öh, warum denn?
Weil man noch paar Dinge auf der Startseite (index.php) beachten muss.

PHP-Code:
<?php
  session_start
(); 
  include_once(
'login.form.php');
  include_once(
'login.functions.php');
  
  
$_SESSION['path'] = "http://pfad.zum/system/"//SEHR WICHTIG!!!
?>
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 //EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
 <head>
  <title>Login</title>
 </head>
 <body> 
  <?php
  
//Wenn es keine Fehler gibt, paar Dinge anzeigen
  
if(empty($_GET['error']))
  {
    echo 
"Online: ";
    echo (
isOnline()?"Ja":"Nein"); //Ist man eingelogt?
    
echo "<br>";
    
getLoginForm(); //Feld zum einloggen
    
getLoginForm("regist"); //Feld zum registrieren
  
?>
  <br><a href="privat.php">Privat</a>
  <?php
  
}
  else
  {
    
checkError(); //Fehlermeldung ausgeben
  
}?>
 </body>
</html>
Oh, ich hab noch was vergessen. Da ist ja ein Link zu privat.php
Diese Datei zeigt noch paar Persönliche Sachen an:

PHP-Code:
<?php
session_start
();
//Man muss eingeloggt sein!
define("NEED_LOGIN"1);
include_once(
'login.functions.php');
include_once(
'login.form.php');
$user $_SESSION['user'];
echo 
"ID: ";
echo 
$user[0];
echo 
"<br>Name: ";
echo 
$user[1];
echo 
"<br>Angemeldet am: ";
echo  
date("H:i:s d.m.Y",$user[3]);
echo 
"<br>Letzter Login am: ";
echo 
date("H:i:s d.m.Y"$user[4]);
echo 
"<br>";
getLoginForm("delete"true);
?>
So und nun haben wir ein (hoffentlich) funktionierenden Login-Skript

Jetzt noch ein Beispiel für diese Login-Sctipt in Verbindun mit dem Template-System von Covin. Es ändert sich nur etwas in der Index.php


kann dann so aussehen:
PHP-Code:
<?php
  session_start
();
  include_once(
'template.php');
  include_once(
'login.form.php');
  
  
$_SESSION['path'] = "http://localhost/CMS/";
  
  
$T = new Template();
  
$T->load('index.tpl');
  
  
$form getLoginForm();
  
$name $_SESSION['user']['name'];
  
$name = (!empty($name)) ? $name "Gast";
  
  
$T->assign('title','test');
  
$T->assign('login_form'$form);
  
$T->assign('content''Hallo ' $name);
  
  
$T->out();
?>
Dazu braucht man noch ein Template:

Code:
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 //EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
 <head>
  <title>{!title}</title>
 </head>
 <body>
  {!login_form}<br>
  {!content}
 </body>
</html>
Ich hoffe, da ist kein Fehler drin, ich hab es nämlich bisschen zusammen geschnitten, aber ich meine, dass es gut aussieht.

Also dann, viel Spaß mit meinen Login-Skript. Ich hoffe, man hat alles verstanden

MfG,
Xean

// edit: kleinen Fehler behoben. Siehe: Problem mit den "[PHP] Login-System No.2" von Xean

Geändert von Jann Hendrik (24.10.2007 um 13:01 Uhr)
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Thema geschlossen

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Ein sessionbasiertes Loginsystem Ben Tutorials 5 18.01.2009 14:42
[PHP] Simples Caching System mittels Dateien Chr!s Tutorials 5 04.11.2006 23:55
Login an Server karabey PHP-Programmierung 22 01.04.2006 16:26
Mitgliederbereich mit Login (Session) _root PHP-Programmierung 10 16.03.2006 21:36
Problem bei Login System druckgott PHP-Programmierung 9 13.05.2005 11:21


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0

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 42 43 44 45 46 47