Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Login Skript    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
     Login Skript Zitat | Bearbeiten

Ein Login-Skript unter Verwendung von OOP

Hey Leute,

hab nun aufgrund des Tutorialwunsches dieses Tutorial hier geschrieben, und los geht´s:


Das Einbinden der Klasse
Erstmal das einfachste von Allem, erstmal muss die Klasse eingebunden werden. Ich benutze hier aus folgendem Grund require_once():

include: fügt eine Datei beliebig häufg ein und lässt das Skript bei Fehlern weiterlaufen und gibt bloß eine Warnung aus.
require: Tut das gleiche, jedoch bricht es bei einem Fehler das gesamte Skript ab und gibt ne Fehlermeldung aus.
include_once: Gleiche wie include, nur wird hier die Datei nur einmal eingebunden.
require_once: Gleicher Zusatzeffekt wie "include_once"

Hier sollte sofort ersichtlich werden, was für uns geeignet ist. Ohne der Datei geht nix, also benutzen wir require, außerdem braucht man die
Klasse nur einmal einzubinden, mehrmals ist nur schädlich für die Performance, also: "require_once()"

Außerdem gibt es noch heftige Performanceunterschiede bei der Angabe des Pfades zur Datei.
Kurz:

Relativer Pfad (Pfad von der Datei aus) wie zB: "/Ordner/datei.php"
Ist am schlechtesten geeignet!, da PHP den Pfad erstmal neu berechnen muss, gibt es hier die größten Performanceverluste.

Semiabsoluter Pfad (Datei befindet sich im gleichen Verzeichnis) wie zB "./Ordner/datei.php"
Durch den Punkt wird gekennzeichnet, dass vom gleichen Verzeichnis wie die momentan ausgeführte Datei ausgegangen wird.
Diese Datei ist um einiges besser als die relative Pfadangabe, aber es geht noch besser

Absoluter Pfad (Der gesamte Pfad von der Root-Struktur aus) wie zB "C:\\User\UserName\Desktop\Ordner\datei.php"
ist von allen Möglichkeiten am Performancebesten, da hierbei die komplette Zusatzarbeit von PHP abgenommen wird.


Absoluter Pfad in PHP bestimmen
Es gibt eine Konstante namens __FILE__, in dieser ist der momentane Name der Datei definiert.
Nun kombinieren wir das mit der Funktion dirname(), mit dieser Funktion bekommen wir den absoluten
Pfad zu der Datei, die wir als Übergabeparameter übergeben.

 PHP 
1:
2:
3:
4:
5:
6:
<?php
//RDIR als Abkürzung für: Root-Directory (Wurzelverzeichnis)
define ('RDIR'dirname(__FILE__));

require_once (
RDIR 'login.class.php')
?>



Die Verwendung der PHP-Klasse "Login"
Nachdem wir die Datei nun erfolgreich eingebunden haben, erzeugen wir erstmal ein Objekt, indem wir die Refenz dieser Klasse als Instanz auf in einer
Variable definieren.(Ich liebe es, so zu sprechen xD) Auf Deutsch: wir verwenden den New-Operator


 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<?php
//RDIR als Abkürzung für: Root-Directory (Wurzelverzeichnis)
define ('RDIR'dirname(__FILE__));

//Die Klasse "Login" einbinden
require_once (RDIR 'login.class.php')

//Objekt erzeugen
$User = new Login;
?>



Wichtig für die Verwendung der Klasse sind nur 2 Dinge: die Methode (So nennt man die Funktionen in einer Klasse)
logged_in(), diese checkt, ob man eingeloggt ist oder nicht (Rückgabewert true oder false).
Und natürlich, wie man sich ein- und ausloggt. Dies geht über den Construktor (dazu später mehr) und
über die GET-Variable action. also bei ?action=logout wird man automatisch ausgeloggt und
bei ?action=login halt eingeloggt.

Hier mal ein Codebeispiel:

 PHP 
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:
<?php
//RDIR als Abkürzung für: Root-Directory (Wurzelverzeichnis)
define ('RDIR'dirname(__FILE__));

require_once (
RDIR 'login.class.php')



$User = new Login();

if(
$User->logged_in())
   {
   echo 
'Du bist eingeloggt!<br />';
   echo 
'<a href="?action=logout">Ausloggen</a>';
   }
else
   {
   echo 
'Du bist zur Zeit nicht eingeloggt.';
   echo 
'<form action="?action=login" method="post">
         <input type="password" name="passwort" /><br />
         Dauerhaft einloggen&nbsp;&nbsp;
         <input type="checkbox" name="dauerhaft" /><br />
         <input type="submit" value="Einloggen" />
         </form>'
;
   }
?>


Ist doch ganz simpel, oder?
Diese Klasse hat auch noch den Vorteil, dass sone schwule Weiterleitung nicht mehr nötig ist


Die Klasse im Detail
Allgemein: Die Interzeptormethode (Schönes Wort ) __construct wird aufgerufen, wenn die
Referenz der Klasse gerade per dem New-Operator auf eine Variable übertragen wird.
Sie wird also per Zeile 10 (Siehe Codeschnipel hier drüber) aufgerufen.
Hier wird nun der Status (On oder Off) gesetzt und auf die GET-Variable "action" geprüft.
Die restlichen Methoden sollten per Kommentate gut genug erklärt sein:

 PHP 
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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
<?php
/**
* Die Login-Klasse
*/
class Login
   
{
   
//Hat den Wert 0 oder 1, on oder off ;)
   
private $status;

   
//Den Namen der Session und des Cookies fest definieren
   
const SNAME 'LOGGED_IN';

   
   
/**
   * Der Konststruktur, er wird bei der Erzeugung
   * des Objekts aufgerufen. Prüft auf Sessions und
   * Cookies und prüft die GET-Variable "action"
   */
   
public function __construct ()
      {

      
//Die Session starten
      
session_start();

      
//Ist eine Session oder ein Cookie gesetzt?
      
if(isset($_SESSION[self::SNAME]) or isset($_COOKIE[self::SNAME]))
         
$this->status 1;
      else
         
$this->status 0;



      
//Erstmal ganz allgemein prüfen,
      //ob sich die GET-Variable in der URL befindet
      
if(isset($_GET['action']))
         {
         
//Wert in einer Variable ablegen
         
$action $_GET['action'];

         
//Wenn der Wert "login" ist...
         
if($action == 'login')
            {
            
//...prüfen, ob die POST-Variable "dauerhaft" dabei ist,
            //um ggf. das Cookie zu setzen. Diese POST-Variable
            //stammt von einer Check-Box ;)
            
if(isset($_POST['dauerhaft']))
               
$use_cookie true;
            else
               
$use_cookie false;

            
//Die Methode login aufrufen und einloggen,
            //evtl. auch das Cookie benutzen
            
$this->login($use_cookie);
            }
         
//Oder der Wert ist "logout", dann...
         
else if($action == 'logout')
            {
            
//... wird sich ausgeloggt, indem die
            //entsprechende Methode aufgerufen wird
            
$this->logout();
            }
         }
      } 
//Konstruktor ENDE


   /**
   * login()
   * @param  boolean  $use_cookie
   * Setzt die Session und ggf. auch das Cookie
   */
   
public function  login ($use_cookie)
      {
      
//Ist der User momentan nicht eingeloggt? Dann...
      
if(!$this->logged_in())
         {
         
//Status auf 1 (On) setzen
         
$this->status 1;
         
//Session setzen
         //Zugriff auf die Konstante per self::SNAME
         
$_SESSION[self::SNAME] = true;

         
//Falls gegeben, Cookie setzen
         
if($use_cookie)
            
//Die Laufzeit beträgt eine Woche
            //60s * 60 = 1 Stunde
            //1 Stunde * 60 = 1 Tag
            //1 Tag * 7 = 1 Woche
            
setcookie(self::SNAMEtrue, (time()+60*60*24*7));
         }
      }


   
/**
   Prüft einfach bloß die Eigenschaft und
   stellst dadurch off der on fest
   */
   
public function logged_in ()
      {
      if(
$this->status == 1)
         return 
true;
      else
         return 
false;
      }


   
/**
   * Setzt den Status auf 1 (Off) und
   löscht ggf. die Session oder das Cookie
   */
   
public function logout ()
      {
      if(
$this->logged_in())
         {
         
$this->status 0;

         if(isset(
$_SESSION[self::SNAME]))
            unset(
$_SESSION[self::SNAME]);

         
//Cookie löschen, indem die Aufenhaltszeit
         //in die Vergangenheit gelegt wird
         
if(isset($_COOKIE[self::SNAME]))
            
setcookie(self::SNAMEfalse, (time()-60));
         }
      }
   } 
//Login-Kasse ENDE
<?php



Viel Spaß damit!

Im Konstruktor muss diese Teil noch angepasst werden:

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?
         
//Wenn der Wert "login" ist...
         
if($action == 'login')
            {
            
//...prüfen, ob die POST-Variable "dauerhaft" dabei ist,
            //um ggf. das Cookie zu setzen. Diese POST-Variable
            //stammt von einer Check-Box ;)
            
if(isset($_POST['dauerhaft']))
               
$use_cookie true;
            else
               
$use_cookie false;

            
//Die Methode login aufrufen und einloggen,
            //evtl. auch das Cookie benutzen
            
$this->login($use_cookie);
            }


Und zwar müssen hier die Logindaten noch gecheckt werden, zB so:

 PHP 
1:
2:
3:
4:
5:
<?
if($_POST['passwort'] == 'richtig')
   
$this->login($use_cookie);
else
   echo 
'Falsches Passwort';


Bei dem Else kann auch eine neue Methode aufgerufen werden, die dann die Fehlermeldung übernimmt.

Hier die Demo:
http://alexf.ath.cx/basti/Tutorials/Login/

Das Passwort ist: richter


So ich hoffe, das zeigt das Prinzip soweit ganz gut =)


Anmerkung:
Ich benutze immer Single Quotes (') anstatt Double Quotes ("), weil Single Quotes performaneter
sind, da PHP bei Double Quotes jedesmal den gesamten String nach Variablen durchsucht.
Beispiel:

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<?
$var 
'Hallo';

//Ausgabe: Hallo Basti
echo "$var Basti";

echo 
'<br />';

//Ausgabe: $var Basti
echo '$var Basti';


Gruß Basti!




Post wurde schon 3x editiert, das letzte mal am 01.03.2011 um 11:34 von Andavos
20.12.2009, 20:02 Profil | PM | E-Mail  
md5()
Mitglied
Guter User


Dabei seit: 18.12.2009
Herkunft: Ukraine
Posts: 273
      Zitat | Bearbeiten

Wow, deine Klasse ist zu kompliziert fur mich


20.12.2009, 20:28 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Hehe is ja lustig =)
Hast du dich schon mit OOP richtig auseinandergesetzt?
Mein CMS besteht nur aus diesen Dingern und viel emhr Interzeptormethoden und mit einigen Design Pattern und blabla xD
Kommt auch bald noch hier rein


20.12.2009, 20:30 Profil | PM | E-Mail  
stex
Mitglied
Sehr guter User


Dabei seit: 14.04.2009
Herkunft: Hannover
Posts: 650
      Zitat | Bearbeiten

Schön geschrieben das ganze.

Top Arbeit


20.12.2009, 20:56 Profil | PM | E-Mail  
Vielgeist
Mitglied
Exzellenter User


Dabei seit: 26.12.2008
Herkunft: Berlin
Posts: 1371
      Zitat | Bearbeiten

hui auch ein wenig zu hoch für mich.


werd mich da aber durchkämpfen, ansonsten biste ja nciht aus der welt


PS.

Da ist auch bei dir der Fehler

 Code 
1:
2:
3:
4:
5:
6:
Cookie wurde gesetzt!

Warning: Cannot modify header information - headers already sent by (output started at /var/www/basti/Tutorials/Login/index.php:47) in /var/www/basti/Tutorials/Login/index.php on line 92
Du bist eingeloggt!
Ausloggen


und zwar wenn man auf dauerhaft login klickt


CONTEMPLATION

If today was perfect, there would be no need for tomorrow.


Mein Youtube Channel

Post wurde schon 1x editiert, das letzte mal am 20.12.2009 um 22:02 von Vielgeist
20.12.2009, 21:59 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Hey,

bei mir ist das nicht der Fall. Der Fehler kommt dadurch zu stande, dass du eine Ausgabe machst, bevor der Header fertig gesendet wurde.
Erst braucht PHP eine genaue Anweisung, wie er das Skript zu bearbeiten hat, und dies bestimmt der Header.
Und die Funktion session_start(); ist eine solche Headeranweisung. Ist ja auch Blödsinn, ihm den
Code zu geben und erst beim Abarbeiten zu sagen,
dass er plötzlich auf Sessions achten soll, evtl.
hat er das Lesen der Sessions separat und wird nur geladen, wenn der Header es ihm auch mitteilt.

Lösung:
Diese Codezeile:
 PHP 
1:
2:
<?
$User 
= new Login;


Muss vor jeder verdammten Ausgabe sein!
Da er im Konstruktor die Funktion session_start() aufruft


20.12.2009, 22:12 Profil | PM | E-Mail  
Vielgeist
Mitglied
Exzellenter User


Dabei seit: 26.12.2008
Herkunft: Berlin
Posts: 1371
      Zitat | Bearbeiten

Ähm das passiert mir bei deinem Testscript dass du hochgeladen hast.

Ich geb richter als pw ein und sag dauerhaft einloggen

und dann bringt er die nachricht.


CONTEMPLATION

If today was perfect, there would be no need for tomorrow.


Mein Youtube Channel
20.12.2009, 23:46 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Äh jo, habs nun behoben, war genau das Problem, welches ich vorher erklärt hatte =)
Aber aufm Localhost kam der Fehler nicht...
War halt ein Fehler im chronischen Ablauf

Natürlich darf auch vor setcookie() keine Ausgabe erfolgen, da dies auch eine Header-Anweisung ist!


20.12.2009, 23:56 Profil | PM | E-Mail  
Marco7757
Mitglied
Sehr guter User


Dabei seit: 12.01.2007
Herkunft:
Posts: 596
      Zitat | Bearbeiten

Super Tutorial, gefällt mir.

Das Beste daran finde ich die Tips zur Performance Die werde ich mir merken!

Ganz kleine Anmerkung:
In einem Kommentar steht, dass ein Tag 1h * 60 ist. Das stimmt natürlich nicht, es sind nur 24 Stunden . Da es im Code aber richtig steht, wirkt sich das nicht auf die Zeit aus.


slothg
The Gearwheel
22.12.2009, 17:12 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

Erstmal gut erklärt!

Aber:
Ein Problem gibt es ja für cookies: man kann sie ändern.

mit dem ff 3.5 mag das addon gerade nicht gehen, aber mit dem opera kann man die cookies ganz einfach ändern, also solltest du dir da noch was überlegen mitdem loginstatus..


Signaturen sind doof
23.12.2009, 12:27 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Hallo,

mit den Cookies sehe ich da eher weniger ein Problem. Sollte irgendwer die mit Absicht ändern,
passiert sowieso nix schlimmes, er ist dann halt nur ausgeloggt, da das Skript nur mit den richtigen Werten arbeiten kann.


24.12.2009, 12:23 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\admin.php:12) in C:\xampp\htdocs\login.class.php on line 23

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\admin.php:12) in C:\xampp\htdocs\login.class.php on line 23
Falsches PasswortSie müssen sich einloggen, um in den Administrationsbereich der Seite zu gelangen.
[hier ist das pw-Fenster]
Dauerhaft einloggen

Falsches Passwort

<-- ich bekomme diese Ausgabe an den Kopf geworfen.


30.05.2010, 11:19  
Vielgeist
Mitglied
Exzellenter User


Dabei seit: 26.12.2008
Herkunft: Berlin
Posts: 1371
      Zitat | Bearbeiten

du hast schon html code der vor der phpdatei mit den cookies und dem session ausgeführt wird.


CONTEMPLATION

If today was perfect, there would be no need for tomorrow.


Mein Youtube Channel
30.05.2010, 12:26 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Und wo soll in der class Datei denn die Passwortpfüfung vorgenommen werden?


30.05.2010, 13:42  
Gast


      Zitat | Bearbeiten

Also ich mein jetzt diesen Scriptteil mit dem check.
An welche Stelle ghört der gesetzt?


30.05.2010, 15:35  
Gast


      Zitat | Bearbeiten

Gutes Tut. Habs sogar verstanden, obwohl ich mir gestern OOP das erste mal in meinem Leben angeschaut habe

Wenns erlaubt ist, werde ich es auf meiner Seite weiterverwenden und das alte, unübersichtliche Script durch dieses ersetzen


26.09.2011, 18:25  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Login Skript   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz