Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „[PHP + MySQL] LogIn über Tabelle“

Sinane

Puttmacherin

Huhu,

ich würde gerne den LogIn für einen Admin-Bereich über eine MySQL-Tabelle laufen lassen. Wenn sich jemand einloggt, sollen die Daten mit der "user"-Tabelle abgeglichen werden und dann diverse Werte (Username, Zeitpunkt des LogIns, Zeipunkt wann dieser abläuft, etc.) in der Tabelle "admin_session" gespeichert werden.
Beim Aufrufen eines Admin-Scripts soll nun geprüft werden, ob der Benutzer eingeloggt ist, und ob seine Session noch aktuell ist. Wenn ja, wird der Ablaufzeitpunkt hochgesetzt, wenn nein der Datensatz gelöscht und er muss sich neu einloggen.

Leider hab ich nur Scripte und Tuts gefunden, die mit Usertabelle und Sessions arbeiten (vllt hab ich auch was übersehen?)... Kann mir jemand erklären, wie ich das machen kann, bzw mir beim Einstieg helfen?


GRUß Sinane
 

Duddle

Posting-Frequenz: 14µHz

AW: [PHP + MySQL] LogIn über Tabelle

Naja, du hast dann eben eine Session-Tabelle mit userid und letztem Aktivitäts-Zeitstempel.

Einloggen: prüfen, ob schon ein Eintrag vorhanden ist. Wenn ja, Zeitstempel auf jetzt aktualisieren. Wenn nein, userid und Zeit eintragen. Das sind jeweils 2 versch. Datenbankabfragen.

Bei jeder Admin-Aktion: prüfen, ob Eintrag vorhanden ist, bei dem die Differenz von aktueller Zeit und letzter Aktivität klein genug ist. Wenn ja, Zeitstempel auf jetzt aktualisieren. Wenn nein, ist das ein Timeout. Also jeden Eintrag vom User in der Session-Tabelle löschen und auf die Login-Seite umleiten. Das sind auch jeweils 2 versch. Datenbankabfragen.

Ausloggen: jeden Eintrag vom User in der Session-Tabelle löschen. Das ist 1 Abfrage.

Das sollte ausreichend schnell und sauber sein. Ich weiß nicht, ob es bessere Lösungen gibt - bestimmt - aber diese sollte funktionieren.


Duddle
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

Aaaaalso... Folgendes Problem: Sobald sich ein zweiter Admin einloggt, bekommt dieser "ZUGRIFF VERWEIGERT" aus dem else ...

Code dazu (login.php):
PHP:
$admin_name      = $_POST['admin_name'];
$admin_pw        = $_POST['admin_password'];

$admin_name      = mysql_real_escape_string($admin_name);
$admin_pw        = mysql_real_escape_string($admin_pw);

$admin_pw        = md5($admin_pw);

$result  = $SQL->query("SELECT * FROM ".USER." WHERE username = '".$admin_name."' AND pw = '".$admin_pw."'");
$check = mysql_fetch_assoc($result);

if(mysql_num_rows($result) == 1)
         {
         $userid                 = $check['id'];
         $ip                     = $_SERVER['REMOTE_ADDR'];
         $browser                = $_SERVER['HTTP_USER_AGENT'];
         $expire                 = date("U");
         $_SESSION['adm_id']     = $check['id'];
         $_SESSION['adm_pw']     = $check['pw'];
         $SQL->query("INSERT INTO ".ADMIN_SESSION."
                 (userid, ip, browser, expire) VALUES
                 ('".$SQL->esc($userid)."','".$SQL->esc($ip)."','".$SQL->esc($browser)."','".$SQL->esc($expire)."')");
         eval ("\$site_content .= \"".gettpl("events/login_success")."\";");
         header('refresh:5; ?path=start');
         }
         else
         {
         die('ZUGRIFF VERWEIGERT');
         }
Und (index.php):
PHP:
$adm = $SQL->query("SELECT * FROM ".ADMIN_SESSION." WHERE userid = '". $id ."'");
$admin = mysql_fetch_assoc($adm);
if(isset($_SESSION['adm_id']) && isset($_SESSION['adm_pw']) && $admin['expire'] + 3600 > date("U"))
         {
         eval ("\$navbar .= \"".gettpl("admin/navbar")."\";");
         }else{
         eval ("\$login .= \"".gettpl("admin/login")."\";");
         }
Wie kann ich bewerkstelligen, dass sich zwei einloggen können?

Und wie kann ich beim Aufrufen der indedx.php überprüfen, ob abgelaufenen Sessions ( expire + 3600 < date("U") ) vorhanden sind und diese löschen? Mein letzter Versuch mit Hilfe von $_SESSION['adm_id'] ist schief gegangen, weil die ja natürlich iwann ungültig wird... :(
 

Duddle

Posting-Frequenz: 14µHz

AW: [PHP + MySQL] LogIn über Tabelle

Dein "Zugriff verweigert" erscheint genau dann, wenn "mysql_num_rows($result) == 1" nicht zutrifft. Das heißt, mysql_num_rows($result) liefert irgendeine andere Zahl ungleich 1, deshalb geht er in den else-Zweig.

Das hat auch noch überhaupt nichts mit den Sessions zu tun, da du nur die USER-Tabelle abfragst. Der else-Fall kann bei weniger als 1 (also 0, dann ist Nutzername/Passwort falsch, okay) oder mehr als 1 eintreten. Letzeres kann nur eintreten, wenn es mehrere Benutzer mit gleichem Passwort und Namen gibt. Falls das bei dir möglich ist, dann hast du einen Modellierungsfehler gemacht.

Du solltest dir also anzeigen lassen, wieviele Datensätze mit deinem SELECT gefunden werden, sobald sich ein anderer Admin einloggen will - und im Anschluss entsprechende Fehler in der Datenbank bereinigen.

Auch möglich, aber unwahrscheinlicher, ist, dass mysql_num_rows gar ein FALSE zurückgibt, falls es in der Abfrage selbst schon einen Fehler gab. Das musst du im Notfall auch noch prüfen.

Zu deiner zweiten Frage:
Ich kann dein expires in ADMIN_SESSION zweierlei interpretieren. Entweder steht es für den Punkt in der Zukunft, an dem diese Session nicht mehr gültig ist (direkt Übersetzung von "expires"), oder es steht für den Zeitpunkt in der Vergangenheit der letzten Aktivität. Dein expires + 3600 weist auf letzteres hin, deshalb behandle ich expires auch so.

Du holst dir die userid vom aktuellen Admin (in der Session, oder nochmal per SQL-Abfrage auf USER), dann fragst du ADMIN_SESSION, ob es Datensätze mit exakt dieser userid und mit expires < jetzt-3600 gibt. Also konkret:
PHP:
$sql = "SELECT * 
        FROM ".ADMIN_SESSION." 
        WHERE userid = ".$id."
        AND expires >= ".(date("U")-3600).";";

Wenn das eine Zeile zurückgibt, dann ist er noch im Zeitfenster. Ansonsten liegt ein Timeout vor, oder er hat nie einen Eintrag in ADMIN_SESSION gehabt.

Beim zweiten Lesen kann ich deine Frage auch falsch interpretiert haben. Möchtest du bei jedem index.php-Aufruf potenzielle Leichen in ADMIN_SESSION löschen? Das wäre dann sowas wie
PHP:
$sql = "DELETE
        FROM ".ADMIN_SESSION." 
        WHERE expires < ".(date("U")-3600).";";

Aber wie immer bei Löschvorgängen, erstmal trocken testen.


Duddle
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

Mir ist gerade was aufgefallen...: Und zwar werden beide Zweige ausgeführt... Es wird alles korrekt in ADMIN_SESSION geschrieben, und DANN noch der else-Zweig abgearbeitet, also 'ZUGRIFF VERWEIGERT' angezeigt...

Wie kann denn sowas geschehen??
 

Duddle

Posting-Frequenz: 14µHz

AW: [PHP + MySQL] LogIn über Tabelle

Garnicht :)

Vielleicht, aber das ist nur Spekulation, liegt es am Ändern des Headers. Ich habe im Hinterkopf, das man nach einem header(...); immer ein exit; als Anweisung setzen soll, um die Weiterausführung zu verhindern. Das heißt, du könntest mal testweise ein exit; dahinter (also vor dem schliessenden if-Zweig) schreiben und es so probieren. Ansonsten... *schulterzuck*


Duddle
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

Huhu,

danke für deine Hilfe :) Das Herauslöschen funktioniert super, allerdings der Rest nicht :(:(:(

Hab mich jetzt entschlossen, diesen Teil vom Script mal komplett zu erneuern, is ja nicht viel, sobald ich dazu gekommen bin und Ergebnisse habe meld ich mich mal ;)


GRUß Sinane
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

So also ich bin jetzt echt am Verzweifeln... Egal was ich mache, mal passiert das, mal das, aber nicht das, was passieren soll. Ich werde jetzt einmal den kompletten Code einstellen und schreiben, wo die Probleme liegen, und dann hoffen, dass mir jemand aus der Patsche helfen kann :'(

index.php:
PHP:
<?php
/**
* Some Comments...
*/

session_start();

if(!defined('incpro'))
         define('incpro','true');
define('root','../');
require_once(root.'include/loader.php');

eval ("\$topbar .= \"".gettpl("admin/topbar")."\";");

$now = date("U");
$SQL->query("DELETE FROM ".ADMIN_SESSION." WHERE expire + 60 < '".$now."'");

$id = $_SESSION['adm_id'];
$adm = $SQL->query("SELECT * FROM ".ADMIN_SESSION." WHERE userid = '". $id ."'");
$admin = mysql_fetch_assoc($adm);
if(isset($_SESSION['adm_id']) && isset($_SESSION['adm_pw']) && $admin['expire'] + 60 > date("U"))
         {
         eval ("\$navbar .= \"".gettpl("admin/navbar")."\";");
         }else{
         eval ("\$login .= \"".gettpl("admin/login")."\";");
         }
echo $admin['expire'];
if(isset($_GET['path']))
         {
         if(file_exists($_GET['path'].'.php'))
                 {
                 include($_GET['path'].'.php');
                 }else{
                 include('../include/cont/error/404.php');
                 }
         }else{
         include('start.php');
         }

eval ("echotpl(\"".gettpl("admin/main")."\");");


?>

login.php, aufgerufen durch ?path=login:
PHP:
<?php
/**
* Some Coments...
*/

session_start();

if(!defined('incpro'))
         die('No Access');

$adm_name        = $_POST['adm_name'];
$adm_pw          = $_POST['adm_password'];

$adm_name        = mysql_real_escape_string($adm_name);
$adm_pw          = mysql_real_escape_string($adm_pw);

$adm_pw          = md5($adm_pw);

$check  = $SQL->query("SELECT * FROM user WHERE username like '". $adm_name ."' AND pw like '". $adm_pw ."' AND status = '1'");
$admin  = mysql_fetch_assoc($check);

if(mysql_num_rows($check) == 1)
         {
         $id             = $admin['id'];
         $ip             = $_SERVER['REMOTE_ADDR'];
         $browser        = $_SERVER['HTTP_USER_AGENT'];
         $expire         = date("U");
         $SQL->query("INSERT INTO ".ADMIN_SESSION."
                 (userid, ip, browser, expire) VALUES
                 ('".$SQL->esc($id)."','".$SQL->esc($ip)."','".$SQL->esc($browser)."','".$SQL->esc($expire)."')");
         $_SESSION['adm_id']             = $admin['id'];
         $_SESSION['adm_password']       = $admin['pw'];
         eval ("\$site_content .= \"".gettpl("events/login_success")."\";");
         header('refresh:5; ?path=start');
         }
         else
         {
         die('ZUGRIFF VERWEIGERT');
         }
?>

So, es gibt zwei Probleme, die auftreten:


  1. Ich kann mich als Admin einloggen, sowohl Session-Variablen werden gesetzt, als auch ein MySQL-Eintrag gemacht. Ich sehe den Admin-Bereich, gut. Möchte sich aber nun eine Freundin zeitgleich einloggen, so wird zwar der entsprechende MySQL-Eintrag gemacht, aber sie bekommt auch "ZUGRIFF VERWEIGERT" angezeigt, auch kann sie weiterhin nicht auf Admin-Funktionen zugreifen.
  2. Wenn wir uns einloggen, werden sowohl Session-Variablen gesetzt, als auch ein MySQL-Eintrag gemacht. Gelangen wir aber nun nach 5 Sek wieder auf die Startseite, so sehen wir das Login-Formular statt des Admin-Bereichs.
Diese Probleme treten seltsamerweise mal so mal so auf, auch ändert es sich, ohne dass ich etwas am Code ändere... Ich bin echt mit meinem Latein am Ende... :'(
 

Duddle

Posting-Frequenz: 14µHz

AW: [PHP + MySQL] LogIn über Tabelle

1. Du hast sicher expire als Timestamp in der Datenbank drin, nicht war? Der wird in Sekunden angeben, deshalb sind nur "+ 60" nicht besonders sinnvoll.

2. Hast du meine Antwort über dieser hier gelesen? Mein Vorschlag war ein exit() nach dem header() in login.php, das hast du nicht drin. Hast du es erfolglos probiert, oder einfach vergessen?

Wenn du 1. und 2. richtiggestellt hast, erledigen sich deine Probleme mglw. schon.

3. Warum machst du eigentlich sowas
PHP:
eval ("\$navbar .= \"".gettpl("admin/navbar")."\";");
Für mich sieht das so aus, als ob du einfach
PHP:
$navbar .= gettpl("admin/navbar");
machen willst, oder ist das von deinem Templatesystem so forciert?

Duddle
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

1. Richtig, aber die 60 Sek dienen jetzt nur der Vereinfachung des Testens. Hab drauf geachtet, dass alle relevanten Handlungen in dieser Zeit geschehen.

2. Stimmt, vergessen zu sagen, das führt dazu, dass statt des Templates (das ja sogar davor steht -.-) 5 Sek lang eine weiße Seite gezeigt wird.

3. gehört zum Templatesystem, ja.


GRUß Sinane
 

Duddle

Posting-Frequenz: 14µHz

AW: [PHP + MySQL] LogIn über Tabelle

Die einzige mir verbleibende Erklärung wäre irgendein skurriler Fehler in Verbindung mit dem Template-System.

Ansonsten müsstest du eben dort, wo du nicht hinkommen solltest mal eine Tonne an Zwischenausgaben reinmachen, also "welchen Wert hat hier eigentlich Variable $foobar", etc.

Ach, eines sehe ich gerade: du initialisierst immer wieder die Session mit session_start. Lt. Handbuch übernimmt er dann nicht automatisch die alte Session, sondern baut eine neue auf. Gleichzeitig benutzt du dann aber Variablen aus der $_SESSION-Globalen. Die werden aber dann leer sein, wenn ich jetzt keinen Denkfehler habe. Wenn sie aber leer sind, wird dein SQL-Query fehlschlagen, usw.
Genau deshalb solltest du mal untersuchen, welche Werte versch. Variablen tatsächlich vor ihrer Benutzung haben.


Duddle
 

Sinane

Puttmacherin

AW: [PHP + MySQL] LogIn über Tabelle

Ach, eines sehe ich gerade: du initialisierst immer wieder die Session mit session_start. Lt. Handbuch übernimmt er dann nicht automatisch die alte Session, sondern baut eine neue auf. Gleichzeitig benutzt du dann aber Variablen aus der $_SESSION-Globalen. Die werden aber dann leer sein, wenn ich jetzt keinen Denkfehler habe. Wenn sie aber leer sind, wird dein SQL-Query fehlschlagen, usw.

DAS WAR DER GRUND!!! DANKEEE!!!

*durchknuddel*

Also falls sich jemals wer ein Beispiel dran nimmt: Nicht zweimal eine Session starten!
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Statistik des Forums

Themen
175.158
Beiträge
2.581.880
Mitglieder
67.226
Neuestes Mitglied
Alec168
Oben