View Single Post
  #14  
Old 01-05-2004, 14:19
Benjy's Avatar
Benjy Benjy is offline
Administrateur
 
Join Date: 21-08-2001
Location: Rueil Malmaison (92)
Age: 45
Posts: 2,043
Send a message via MSN to Benjy
Re: Utilisation de sessions avec PHP

Voici le fichier la classe que j'utilise dans les scripts que je développe ($DB_site est ma couche d'accès à la base de données, $rooturl est l'URL de base du site, $sitename est le nom du site utilisé pour crypter le mot de passe, $sitemembercpdir est le lien vers la zone membres) :
PHP Code:
<?php
error_reporting
(E_ALL & ~E_NOTICE);

class 
Auth
{
 var 
$username = '';
 var 
$password = '';

 function 
auth_check()
 {
  global 
$_SESSION, $DB_site, $rooturl;
  
  
session_name('auth');
  
session_start();
  
  if(isset(
$_SESSION['id']))
  {
   
$session_id = $_SESSION['id'];
   
$session_lastactivity = intval($_SESSION['lastactivity']);
   
   if (
$session_id == md5(intval($_SESSION['userid']) . $_SESSION['username'] . $session_lastactivity))
   {
    
$result = $DB_site->query("SELECT * FROM session WHERE sessionid = '" . $session_id ."'");
    if (
$DB_site->num_rows($result) == 1)
    {
     
$current_time = time();
     
$DB_site->query("UPDATE session SET lastactivity = " . $current_time . " WHERE sessionid = '" . $session_id ."'");
     
$DB_site->query("UPDATE user SET lastactivity = " . $current_time . " WHERE userid = '" . intval($_SESSION['userid']) ."'");
     
     
$past = time() - 3600;
     
$DB_site->query("DELETE FROM session WHERE lastactivity < '" . $past . "'");
    }
    else
    {
     
header("Location:" . $rooturl . "/index.php");
     exit;
    }
   }
  }
  else
  {
   
header("Location:" . $rooturl . "/index.php");
   exit;
  }
 }
 
 function 
auth_login()
 {
  global 
$_SESSION, $DB_site, $rooturl, $sitename, $sitemembercpdir;
  
  
$enc_pass = md5(md5(trim($this->password)).$sitename);
  
$result = $DB_site->query("SELECT * FROM user WHERE username = '" . trim($this->username) . "'");
  if (
$DB_site->num_rows($result) == 1)
  {
   
$row = $DB_site->fetch_array($result);
   if (
$row['password'] == $enc_pass)
   {
    
session_name('auth');
    
session_start();
    
    
$current_time = time();
    
$session_id = md5($row['userid'] . $row['username'] . $current_time);
    
$DB_site->query("DELETE FROM session WHERE userid = '" . $row['userid'] . "'");
    
$DB_site->query("INSERT INTO session (sessionid, userid, lastactivity) VALUES ('" . $session_id . "', '" . $row['userid'] . "', '" . $current_time . "')");
    
$DB_site->query("UPDATE user SET lastactivity = " . $current_time . " WHERE userid='" . $row['userid'] ."'");
    
    
$_SESSION['id'] = $session_id;
    
$_SESSION['userid'] = $row['userid'];
    
$_SESSION['username'] = trim($this->username);
    
$_SESSION['lastactivity'] = $current_time;
  
    
session_write_close();
    
    {
     
header("Location:" . $rooturl . $sitemembercpdir . "/index.php");
     exit;
    }
   }
   else
   {
    
header("Location:" . $rooturl . "/index.php");
    exit;
   }
  }
  else
  {
   
header("Location:" . $rooturl . "/index.php");
   exit;
  }
 }
 
 function 
auth_logout()
 {
  global 
$_SESSION, $DB_site, $rooturl;
  
  
session_name('auth');
  
session_start();
  
  
$current_time = time();
  
$DB_site->query("UPDATE user SET lastactivity = '" . $current_time . "' WHERE userid = '" . intval($_SESSION['userid']) ."'");
  
  
$DB_site->query("DELETE FROM session WHERE userid = '" . $_SESSION['userid'] . "'");
  
  
session_unregister('id');
  
session_unregister('userid');
  
session_unregister('username');
  
session_unregister('lastactivity');
  
  if (
session_register('id'))
  {
   
session_destroy();
  }
  if (
session_register('userid'))
  {
   
session_destroy();
  }
  if (
session_register('username'))
  {
   
session_destroy();
  }
  if (
session_register('lastactivity'))
  {
   
session_destroy();
  }
  
  
header("Location:" . $rooturl . "/index.php");
  exit;
 }
}
?>
Sur les pages nécessitant une identification :
PHP Code:
require_once('./includes/auth.php');
$auth = new Auth;
$auth->auth_check(); 
Sur la page de login ($username et $password ont été passés par un formulaire et, bien sûr, vérifiés comme ne contenant pas de caractère frauduleux) :
PHP Code:
require_once('./includes/auth.php');
$auth = new Auth;
$auth->username = $username;
$auth->password = $password;
$auth->auth_login(); 
Côté MySQL, j'ai ça (la clé sur userid n'est pas indispensable je pense) :
Code:
CREATE TABLE `session` (
  `sessionid` varchar(50) NOT NULL default '',
  `userid` int(10) unsigned NOT NULL default '0',
  `lastactivity` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`sessionid`),
  KEY `userid` (`userid`)
) TYPE=HEAP;
Avec tout ça tu devrais arriver à faire quelque chose de pas trop mal je pense
__________________
Merci de lire et de respecter les règles et d'utiliser la .
Reply With Quote