cybton.com
Über uns | Jobs | Werbung | Sitemap | AGB | Impressum | Hilfe ?
 Kostenlos anmelden)
Forum
Aktuellste Beiträge
Forenregeln

Community
BB-Codes
Tags
Chat
Suche (Web)
Wer ist online?
Top-User

Basar


Statistik
Mitglieder gesamt: 68136
Mitglieder online: 2
Gäste online: 3
mehr...

Anzeige
Forum » Forum: Website & Webprogrammierung » Thread: Login mit session und MySQL

Thread: Login mit session und MySQL

Tags: MySQL , session , Login
Seite 1 von 41234

09.08.2008 23:40 Uhr

 

Status: offline
Abend,

Seit Jahren ist dies meine erste Anlaufstelle für Fragen rund um php ect. Ich habe mich nie Registrert da ich alles über die SuFu gefunden habe. Nun ist es aber doch mal soweit und hoffe ihr könnt mir auch diesmal helfen.

Unzwar suche ich ein Login Script das mit session und MySQL arbeitet. Sprich session wird in der db gespeichert, im php script in na variable zum ständigen aufruf.

Beispiel
PHP:
1
2
3
4
5
6
7
8
<?PHP
if ( !$user['session'] )
{
      echo 'eingelogt';
} else {
      echo 'nicht eingeloggt';
}
?>
Habt ihr dort vieleicht eine einfache Vorlage oder jemand schon ein fertiges Script für mich?
Währe echt Dankbar.

Gruß
gradin
10.08.2008 00:45 Uhr

 

Status: offline
Ich kann dir gerne mal meine Funktion zeigen.
+ 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
<?php
   /** ********************************************************************************************************
   * User anmelden
   * @param username Benutzername
   * @param password Password zum Benutzernamen
   * @return 0 bereits Eingeloggt
   * @return 1 keine Logindaten angegeben
   * @return 2 es gibt mehrere User mit dem Namen
   * @return 3 falsche Zugangsdaten
   * @return 4 erfolgreicher Login
   * @return 5 user nicht aktiviert
   * @return 6 Ungueltiger Benutzername
   */
   function setLogin($username, $password) {
      if($this->is_login()) return 0;
      $db = registry::get('mysql');
      if(!empty($username) && !empty($password)) {
         if(!$this->checkUser($username)) return 6;
         $udata = $db->mysqlArray("select uid, user, password, is_active from user where user='".$username."' and geloescht!='Y'");
         if($udata[0]>0 && $udata[0]<2) {
            if($udata[2][0]['is_active']=='N') return 5;
            if($udata[2][0]['user']==$username && $udata[2][0]['password']==md5(mysql_real_escape_string($password))) {
               $sessionid = $this->sessionid();
               $db->mysqlQuery("update user set session_id='".$sessionid."', ip_oktette='".$this->user_ip."', last_action='".time()."', last_activity='Erfolgreicher Login' where user='".$username."'");
               setcookie("uid", $udata[2][0]['uid'], (time()+$this->cookie_expire), $this->path);
               setcookie("sessid", $sessionid, (time()+$this->cookie_expire), $this->path);
               return 4;
            } else {
               return 3;
            }
         } elseif($udata[0]>1) {
            return 2;
         } else {
            return 3;
         }
      } else {
         return 1;
      }
   }
?>
Arbeitet zwar mit Cookies, und auch mit diversen anderen Klassen, aber vielleicht kannste das ja n bissl abkupfern.
Die Funktion ist brandneu. Bis jetzt scheint auch alle zu funktionieren. Aber wie immer keine Haftung bla...
___________________________
Visit: www.sim4000.de
Ein ball rollt um die Ecke und fällt um.
Intelligenz ist, wenn mein weiß, dass man doof ist.
10.08.2008 06:56 Uhr

 

Status: offline
Moin,

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

EDIT:
Habe jetzt ein einfaches Login Script ohne cookie oder Session
PHP:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE user (
    ID Int(11) NOT NULL auto_increment,
    username VarChar(50) NOT NULL default '',
    password VarChar(50) NOT NULL default '',
    email VarChar(50) NOT NULL default '',
    activ VarChar(50) NOT NULL default '',
    session_id Int(11),
    session_user_id Int(11),
    session_time Int(11),
    PRIMARY KEY (ID)
);
+ 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
 
<?PHP
if(isset($_POST['submit']))
{
$username = $_POST["username"];
$password = md5($_POST["password"]);
 
$sql = "SELECT username, password 
                  FROM user 
            WHERE username=".$username." 
            AND password=".$password."";
$result = mysql_query($sql) OR die(mysql_error());
      $row = mysql_fetch_assoc($result);
 
if($row->passwort == $passwort)
    {
    echo "Login erfolgreich.";
    }
else
    {
    echo "Benutzername und/oder Passwort waren falsch.";
    } 
    
}?>
Dies klappt nicht ganz da ich folgende Meldung erhalte
Zitat:
Notice: Undefined index: password in C:\server\htdocs\login\login.php on line 24
Unknown column 'fdsgfds' in 'where clause'


Vieleicht kann mr ja nebenbei auch einer dabei helfen aber das hauptproblem bleit einfach eben mit den session und cookie in die db schreiben. Könnte jemand anhand meiner abfrage mirdas mal ein bischen erklären?
5 mal bearbeitet
10.08.2008 10:11 Uhr

 

zombie3456
Programmierer
Status: offline
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());
# [TODO] $autoLoginId in Datenbank schreiben
setcookie('auto_login', $username . '|' . $autoLoginId, time()+60*60*24*30); # 1 Monat Gültigkeit

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']);
    # [TODO] Prüfen, ob $username + $autoLoginId so in der Datenbank vorkommen
}
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.  :glad: 


Ä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  :wink: 
6 mal bearbeitet
___________________________
DURATIVUM | Blog zur Sprache Latein
10.08.2008 10:25 Uhr

 

Status: offline
Grüße,

Besten Dank, werde mir das mal in ruhe durch lesen und hoffe auch verstehen und durch setzen können.

Zu dem MySQL. Thx das klappte auch, nur ist das Login ständig erfolgreich auch bei falschem PW oder User oder beidem
10.08.2008 10:28 Uhr

 

Status: offline
Ich versuche mal deinen Code zu korrigieren:
Zitat von php:
$username = $_POST["username"];
$password = md5($_POST["password"]);

$sql = "SELECT username, password
FROM user
WHERE username=".$username."
AND password=".$password."";


Sollte ehr so aussehen:
php:
1
2
3
4
5
6
<?php
  $username = $_POST['username'];
  $password = md5($_POST['password']);
 
  $sql = "SELECT `username`, `password` FROM `user` WHERE `username` = '".$username."'   AND `password` = '".$password."'";
?>
Und von der Theorie her:

Ich programmiere meine Logon Scripts mit 2 Datenbank-Tabellen:
Die 1. kannst du so machen wie zombie3456
Und die 2. nenn ich immer Online, wo dann User-ID, session-ID, IP und "Last active" drin steht.
Bei der überprüfung suche ich dann in der Datenbank nach IP und session-ID. Wenn die gefunden wurde, ist der User online. Wegen "last active" kannst du eine Funktion schreiben, die bei jedem Seitenaufruf ausgeführt wird, die dann User, die sich zu lange nicht gemeldet haben aus der Datenbank löscht. Die muss dann aber noch vor der Überprüfung passieren, ob der User angemeldet ist.

Ich hoffe ich konnte dir ein Wenig helfen.

@zombie3456: Ist meine Methode zu Serverlastig, oder geht's? Und das mit dem Autologin muss ich mir merken! Danke  :lol: 

Edit:// @gradin: Wenn ich wieder @home bin kann ich mal mein Script veröffentlichen! Für dich werd ich das extra mal Kommentieren  :lol:  Zu Sehen auf http://janis-pc.ath.cx/blog.htm
3 mal bearbeitet
___________________________
MFG Jan
"funzt nicht" ist keine gültige Fehlerbeschreibung!*haarerauf*
http://www.sysprofile.de/id30821
10.08.2008 10:35 Uhr

 

Status: offline
@klasse7darg
Das währe echt klasse. In der zwichenzeit versuch ich denoch mich ein wenig mit beiden Lösungen auseinander setzen. Bringt mir ja nix wenn du das Script postet aber ich nix bei lerne.
10.08.2008 10:40 Uhr

 

Status: offline
Zitat von klasse7darg:
Für dich werd ich das extra mal Kommentieren  :lol: 
Mach ich eigentlich nie  :wink: 
Hoffe, dass es dir dann Helfen wird.
___________________________
MFG Jan
"funzt nicht" ist keine gültige Fehlerbeschreibung!*haarerauf*
http://www.sysprofile.de/id30821
10.08.2008 10:45 Uhr

 

zombie3456
Programmierer
Status: offline
Zitat:
@klasse7darg
Das währe echt klasse. In der zwichenzeit versuch ich denoch mich ein wenig mit beiden Lösungen auseinander setzen. Bringt mir ja nix wenn du das Script postet aber ich nix bei lerne.
Ich hab mir eben sim4000's Lösung angeschaut und gesehen, dass er eigentlich auch auf OOP (objektorientierte Programmierung) und eine eigene Datenbank-Klasse aufbaut. Nur hat er dir nur die Hauptfunktion gezeigt. Ist also von der Komplexität her ähnlich wie meines.

Daher sage ich kurz etwas dazu:
PHP:
1
<?php $db = registry::get('mysql');
holt ihm einfach eine Instanz der Datenbank-Klasse, mit der er MySQL-Statements ausführt. Also ähnlich wie die PHP-Funktionen mysql_query() und mysql_fetch_array(), nur dass er dort Funktionen eingebaut hat, die er oft braucht.
PHP:
1
<?php  $udata = $db->mysqlArray("...");
führt ein SQL-Statement aus, welches ein Array an Daten zurückgibt (also praktisch SELECT-Statements).
Das entspricht dem PHP-Pendant:
PHP:
1
2
3
4
5
6
<?php
$qry = mysql_query("...");
$udata = array();
while ($tmp = mysql_fetch_array($qry)) {
    $udata[] = $tmp;
}
PHP:
1
<?php $db->mysqlQuery("...");
führt ein SQL-Statement aus, ohne Daten zurückzugeben. Es entspricht daher einfach dem gewöhnlichen mysql_query(). Wahrscheinlich sind darin noch ein paar weitere Funktionen zur Statistik (zählen, wie viele Datenbank-Abfragen es insgesamt gab), aber du kannst dir das im Kopf einach als mysql_query() denken.
PHP:
1
<?php $this->checkUser($username);
Diese Funktion prüft für ihn, ob es einen Nutzernamen gibt.

Alle restlichen Funktionen sollten meines Wissens nach gewöhnliche PHP-Funktionen sein und sind ja auch auf das PHP-Handbuch verlinkt.
1 mal bearbeitet
___________________________
DURATIVUM | Blog zur Sprache Latein
10.08.2008 11:04 Uhr

 

Status: offline
Zitat:
Mach ich eigentlich nie  :wink: 
Hoffe, dass es dir dann Helfen wird.


Vielen Dank , hoffe ich doch auch mal

@zombie3456
Dein letzer Code den du erklärt hast von sim4000 ist also nix weiteres wie zb
$result = db_query($sql);
ansatt $result = mysql_query($sql) OR die(mysql_error()); ?
Seite 1 von 41234
Ähnliche Threads Forum Ähnlichkeitsgrad
 [gelöst] Fragen bezüglich MySQL Website & Webprogrammierung 1
 [noch ungelöst] Session-Lebensdauer Website & Webprogrammierung 1
 FTP wo und wie? Fragen zu cybton.com 1
 Mysql zwei Tabellen verbinden Website & Webprogrammierung 1
 [Problem] MySQL mehrere Einträge gleichzeitig verändern geht nicht Website & Webprogrammierung 1
 MySQL nur für Localhost Software & Betriebssysteme 1
 Atomatic Mail Respond [For example: Brithday reminder] Website & Webprogrammierung 1
nach obennach oben

Copyright © 2008 cybton-network

Google
Partner: #Musik - Dein Internetradio - nexem. - .wir machen news - Your-Book.net - Dein kostenloses Gästebuch
ANEXIA - PHP Entwicklung - Dockers - s.Oliver Schuhe - Think Schuhe - der eigene Weg - Dorfen - Paul Green Schuhe - Bequeme Geox - Web-Entwicklung