View Single Post
  #3  
Old 01-05-2004, 14:19
Benjy's Avatar
Benjy Benjy is offline
Administrateur
 
Join Date: 21-08-2001
Location: Rueil Malmaison (92)
Age: 44
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