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ö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