Il regroupe tout le code d'accès à la base de données dans une seule classe qui s'occupe d'effectuer les opérations d'ajout/retrait d'utilisateur, ce qui en soi n'a pas grand chose à voir avec une bdd. Pour moi la bdd n'est qu'un support de stockage.
Je n'approuve pas trop son découpage. La classe Process par exemple est un peu bizarre.
Et puis il semble utiliser des variables globales de façon peu sûre (cf :
http://www.php.net/manual/fr/security.globals.php)
Je découperais autrement les classes :
classe Database : Abstraction de l'accès à une base de données. Permet d'exécuter une requête SQL et d'en récupérer le résultat.
classe Utilisateur : Représente un utilisateur, avec ses droits (admin, user, etc...)
Quand un utilisateur a besoin d'être identifié pour accéder à une page, tu lances un script qui vérifie que l'user est identifié, sinon tu rediriges vers un formulaire de login (formulaire qui remplira une variable de session si l'utilisateur est bien identifié).
Pour les pages seulement accessibles aux admins, tu fais pareil, sauf que tu vérifies non seulement que l'user est loggé mais qu'il est également admin.
Ça donnerait par exemple :
---- Fichier check_login.php ----
start_session();
if(!isset($_SESSION['user']))
{
header("location: login.php?referer=".$_SERVER['PHP_SELF']);
exit();
}
---- Fichier check_admin.php ----
require_once("check_login.php");
if(!$_SESSION['user']->is_admin())
{
header("location: forbidden.php");
exit();
}
---- Fichier sys_login.php ----
require_once("User.php"); // fichier contenant la définition de la classe User et de la fonction get_user($login,$pass);
$user = get_user($_POST['login'],$_POST[pwd]);
if($user != null)
{
session_start();
$_SESSION['user'] = $user;
}
header("location: ".$_POST['referer']);
---- Fichier login.php ----
<?php
if(!isset($_GET['referer']))
{
$_GET['referer'] = "index.php";
}
?>
<html>
<head></head>
<body>
<form action="sys_login.php" method="post">
<input type="hidden" name="referer" value="<?=$_GET['referer']?>" />
<label for="id_login">Identifiant : </label><input type="text" name="login" id="id_login" />
<label for="id_pwd">Mot de passe : </label><input type="password" name="pwd" id="id_pwd" />
<input type="submit" name="login" value="Connexion" />
</form>
</body>
</html>
---- Fichier User.php ----
define("LEVEL_USER",0);
define("LEVEL_ADMIN",1);
class User
{
var $level;
var $login;
function User($id)
{
$resultset = $GLOBALS['database']->query("SELECT level,login FROM User WHERE num = ".$id);
$user = $resultset->fetch_assoc();
if($user == false)
{
trigger_error("Utilisateur incorrect");
}
$this->level = $user['level'];
$this->login = $user['login']
}
function is_admin()
{
return $this->level == LEVEL_ADMIN;
}
}
function get_user($login,$pwd)
{
$resultset = $GLOBALS['database']->query("SELECT num FROM User WHERE login = '$login' AND pwd = '".md5($pwd)."'");
$user = $resultset->fetch_assoc();
if($user == false)
{
return null;
}
else
{
return new User($user['num']);
}
}
Je ne donne pas le code de la classe Database. Mais en gros, la fonction query renvoie un objet de type ResultSet. Et ce ResultSet contient une méthode, fetch_assoc qui retourne un tableau associatif contenant les champs de la prochaine ligne de résultat, ou false s'il n'y a plus de résultat.