Bonjour
Aujourd’hui une petite manipulation qui peut-être très pratique… Chargez les données depuis une base de données, directement dans un objet.
Prenons par exemple la gestion des utilisateurs. Lorsque l’utilisateur se connecte, plutôt que de s’amuser à stocker les informations dans une session normale du genre :
$_SESSION['username'] = $data['user'] ;
on va utilisé une méthode bien plus rapide et pratique.
Tout d’abord, on va créer une classe, la classe user . Voici un début de classe :
* @version 0.1 [29.05.2009] */ class User { /** * Attribut */ private $id_user; private $login; private $password; private $name; private $first_name; private $title; private $address; private $NPA; private $city; private $pays; private $tel; private $fax; private $email; private $societe; private $connected; private $active; private $active_code; private $sql; private $password_uncrypted; /** * Construct the class */ public function __construct($sql){ $this -> sql = $sql; } /** * Function toString * * - Return : the login */ public function __toString(){ return $this -> login; } /** * Function used to insert the user in database * * - Return : the query to execute */ public function getInsertString(){ $query = 'INSERT INTO t_user (login, password, name, first_name, address, NPA, city, pays, tel, fax, email, societe,active_code) VALUES '; $query .= '("'.$this -> login.'",'; $query .= '"'.$this -> password.'",'; $query .= '"'.$this -> name.'",'; $query .= '"'.$this -> first_name.'",'; $query .= '"'.$this -> address.'",'; $query .= '"'.$this -> NPA.'",'; $query .= '"'.$this -> city.'",'; $query .= '"'.$this -> pays.'",'; $query .= '"'.$this -> tel.'",'; $query .= '"'.$this -> fax.'",'; $query .= '"'.$this -> email.'",'; $query .= '"'.$this -> societe.'",'; $query .= '"'.$this -> active_code.'")'; return $query; } /** * Function used to connect an user * * - Return : the query to execute */ public function connect(){ $query = 'SELECT * FROM t_user WHERE login = "'.$this -> login.'" AND password = "'.$this -> password.'"'; $query = mysql_fetch_assoc($this -> sql -> Query($query)); $keys = array_keys($query); for($i=0;$i {$keys[$i]} = $query[$keys[$i]]; } if($query['active']){ $this -> connected = true; } else{ $this -> connected = false; } } /** * Fonction used to know if a user already exist in DB */ public function existInDb(){ $bResult = false; $query = 'SELECT COUNT(login) as Nbr FROM t_user WHERE login = "'.$this -> login.'"'; $query = mysql_fetch_assoc($this -> sql -> Query($query)); if($query['Nbr'] > 0){ $bResult = true; } return $bResult; } /** * Function used to generate an activation code */ public function generateActivationCode(){ $len = 10; $base='ABCDEFGHKLMNOPQRSTWXYZabcdefghjkmnpqrstwxyz123456789'; $max=strlen($base)-1; $activatecode=''; mt_srand((double)microtime()*1000000); while (strlen($activatecode)<$len+1) $activatecode.=$base{mt_rand(0,$max)}; $this -> active_code = $activatecode; } /** * Function used to send the confirmation mail */ public function sendConfirmationMail(){ $headers = 'From: "example"'."\n"; $headers .= 'Reply-To:example@example.ch'."\n"; $headers .= 'Content-Type: text/html; charset="iso-8859-1"'."\n"; $headers .= 'Content-Transfer-Encoding: 8bit'; $message = ''; $message .= ' <h1>Activation de votre compte</h1> '; $message .= 'VOTRE MAIL'; $message .= ' <h1>Vos informations</h1> '; $message .= 'Nom d\'utilisateur : '.$this -> login ; $message .= 'Mot de passe : '.$this -> password_uncrypted ; $message .= ' Garder ce mail précieusement...'; $message .= ''; mail($this -> email, 'Création du compte', $message, $headers); } public function activeUser($user,$code){ $query = 'UPDATE t_user SET active = "1" WHERE login = "'.mysql_real_escape_string($user).'" AND active_code = "'.mysql_real_escape_string($code).'"'; $query = $this -> sql -> Query($query); return true; } /** * Magic Function set */ public function __set($key, $value){ $this->$key = $value; } /** * Magic Function get */ public function __get($key){ return $this->$key; } } ?>
Il faut que la classe aie les mêmes champs que la base de données. C’est à dire que si la base de données à un champ “login”, un champ “password”, et un champ “first_name”, il faut absolument que la classe PHP aie les champs “login”, “password”, et “first_name” . Elle peut avoir d’autre champ si vous vous voulez.
Alors au niveau des fonctions interessante, il y a tout d’abord celles là :
public function __set($key, $value){ $this->$key = $value; } /** * Magic Function get */ public function __get($key){ return $this->$key; }
Cette fonction magique permet de générer les getter/setter pour la classe. Ensuite lorsque vous avez instancié la classe dans votre code, vous pourrez faire :
$class -> attribut = 'value';
pour mettre vos valeurs.
L’autre fonction intéressante est celle-ci :
public function connect(){ $query = 'SELECT * FROM t_user WHERE login = "'.$this -> login.'" AND password = "'.$this -> password.'"'; $query = mysql_fetch_assoc($this -> sql -> Query($query)); $keys = array_keys($query); for($i=0;$i {$keys[$i]} = $query[$keys[$i]]; } if($query['active']){ $this -> connected = true; } else{ $this -> connected = false; } }
Elle vous permettra lors de l’appel à cette fonction, de sauvegarder le résultat de la requête dans la classe. C’est à dire que l’utilisateur se connecte, et toutes ses informations seront stocké dans l’objet $user (pour moi). Après il suffit de stocker cette classe dans la session, et vous pourrez l’utiliser sur toutes vos pages
Cette fonction va donc récupéré l’array de données de la base de données, ensuite récupéré les clés, et grâce à la syntaxe
1 | $this -> {$var} =... |
on va pouvoir stocké la valeur, dans l’attribut ayant cette clé. C’est pour cela que je demandais d’avoir les mêmes noms entre la base de données et votre classe php.
Voilà pour ce petit tutoriel…
Bonne nuit