Zitat:
Besten Dank aber irgendwie bringt mich das kein bischen weiter oder es ist einfach zu viel was ich net versteh.
Ob das jetzt mit Cookies arbeite oder nicht, ist eigentlich egal, hauptsache es fonkioniert. Es muss die session in na db speichern so das man sich nicht immer wieder neu einloggen muss
Ich hätte da eine PHP-Klasse (Objektorientierte Programmierung), aber das ist wahrscheinlich viel zu kompliziert.
Daher will ich vielmehr die Theorie angehen:
Damit ein Benutzer eingeloggt bleiben kann, lege ich die Datenbank folgendermaßen an:
MySQL:1
2
3
4
5
6
7
8
9
| +---------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(100) | NO | MUL | NULL | |
| password | varchar(100) | NO | | NULL | |
| auto_login_password | varchar(100) | YES | | NULL | |
| last_login | datetime | NO | | NULL | |
+---------------------+------------------+------+-----+---------+----------------+ |
Das Auto-Login-Password ist eine ID, die später zusammen mit dem Nutzernamen in einem Cookie aufbewahrt wird, um das richtige Passwort auch bei Cookie-Diebstählen geheim zu halten. Bei jedem Login (auch bei Auto-Logins) ändert sich das Auto-Login-Passwort.
Normaler Login über Formular
Du brauchst nun eine Funktion, die eine Session für den Nutzer anlegt, wenn dieser sich korrekt einloggt. Dazu prüfst du bei einem Login über das Formular, ob
username +
password so in der Tabelle vorkommen. Wenn das der Fall ist, kannst du die nötigen Cookie-Daten anlegen. Da reichen im Grunde folgende Werte:
PHP:1
2
3
| <?php
$_SESSION['userid'] = $userid;
$_SESSION['last_active'] = time(); |
Außerdem musst du in der Datenbank noch einen beliebigen Wert für die Auto-Login-ID eintragen, welche du dann auch als Cookie setzen musst.
PHP:1
2
3
4
| <?php
$autoLoginId = md5(uniqid());
setcookie('auto_login', $username . '|' . $autoLoginId, time()+60*60*24*30); |
Prüfen, ob Zugriff erlaubt
Möchte ein Benutzer eine Seite öffnen, dann kannst du zuerst einmal prüfen, ob er überhaupt eingeloggt ist. Dies ist der Fall, wenn die Session für
userid gesetzt ist und
last_active nicht weiter zurückliegt als dein Sicherheitslimit. (z.B. 20 Minuten ohne Aktivität).
PHP:1
2
3
4
5
6
7
| <?php
function isLoggedIn() {
if (isset($_SESSION['userid']) && $_SESSION['last_active'] + 60 * 20 >= time()) {
return true;
}
return false;
} |
Diese Funktion zeigt dir dann an, ob der Benutzer eingeloggt ist.
Login über AutoLoginID
Sollte er nicht eingeloggt sein, dann kannst du schauen, ob der Nutzer automatisch eingeloggt werden kann.
PHP:1
2
3
4
5
| <?php
if (isset($_COOKIE['auto_login'])) {
list($username, $autoLoginId) = explode('|', $_COOKIE['auto_login']);
} |
Wenn die Kombination vorkommt, dann kannst du einen normalen Login durchführen (vgl. oben beim Setzen der Cookies).
Abschließende Worte
Ich hoffe, dass ich dir ein wenig weiterhelfen konnte. Sollten Fragen sein, nur zu. Bei theoretischen Themen helfe ich im Forum immer wieder gerne.
Änderung
Da warst du ja schneller als ich mit deinem Edit.
Zu deiner Frage:
Zitat:
Notice: Undefined index: password in C:\server\htdocs\login\login.php on line 24
Unknown column 'fdsgfds' in 'where clause'
Das liegt daran, dass du keine Anführungszeichen in deinem SQL-Statement hast.
Es sieht praktisch nach Einsetzen der PHP-Variablen so aus:
MySQL:1
2
3
4
| SELECT username, password
FROM user
WHERE username=fdsgfds
AND password=geheim |
Der MySQL-Interpreter denkt sich nun: "Wunderbar, ich schaue mal, ob ich eine Zeile in der Datenbank finde, wo die Spalte
username den gleichen Inhalt hat wie
die Spalte fdsgfds und die Spalte
password den gleichen Inhalt wie
die Spalte geheim."
Damit MySQL versteht, dass du keine Spalten meinst, sondern Texte, musst du Anführungszeichen herummachen, damit der Code nachher so aussieht:
MySQL:1
2
3
4
| SELECT username, password
FROM user
WHERE username='fdsgfds'
AND password='geheim' |
Durch das Syntax-Highlighting erkennt man hier nun sehr schön den Unterschied. Im oberen Beispiel sind dein Nutzername und Passwort blau (MySQL erkennt es als Spalte) im unteren Beispiel rot (MySQL erkennt es als Zeichenkette).
password bietet hier eine Ausnahme, weil es auch eine spezielle MySQL-Bedeutung haben kann (als
SET PASSWORD). Da aber kein
SET davor steht, erkennt MySQL es trotzdem als Spalte an, auch wenn es hier grün markiert ist.
In PHP sieht das folgendermaßen aus:
PHP:1
2
3
4
5
| <?php
$sql = "SELECT username, password
FROM user
WHERE username='".$username."'
AND password='".$password."'"; |
Ich hoffe, man erkennt die einzelnen Anführungszeichen noch irgendwie