Nous allons aujourd’hui commencer à aborder le développement en lui même. Nous allons construire les briques pour un jeu. Des petits bout de code qui sont là pour vous montrer comment moi je vois les choses. Les lignes ne sont pas à copier-coller !!! Elles sont là pour vous montrer dans quel esprit je développe.
Aujourd’hui nous allons aborder la classe membre. On va la créer assez minimaliste pour commencer. Voici ce qu’elle devra gérer :
- Création d’un utilisateur avec diverses vérifications :
- Unicité du login
- Adresse email valide
- Attribut désiré de bonne taille
- Encodage du mot de passe en md5
- Récapitulatif de toutes les infos
- Sauvegarde des données
Cette classe sera en PHP 5, utilisera PDO en global.
Utilisation de PDO :
On inclus le fichier config/pdo.php pour que la classe fonctionne correctement. Voici comment il est composé :
/* Fichier de configuration de PDO Mise à jour : 11 mai 2009 Auteur : SorenS */ /* Constantes pour la connexion */ define('DB_HOST','localhost'); // hôte pour la BDD define('DB_NAME','test'); // nom de la base define('DB_LOGIN','root'); // login d'identification à la base define('DB_PASSWORD',''); // mot de passe de la base // dsn nécessair pour PDO (mysql) define('DSN_MYSQL','mysql:host='DB_HOST';dbname='DB_NAME); // connexion à la bdd try{ $pdo = new PDO(DSN_MYSQL,DB_LOGIN,DB_PASSWORD); } catch(PDOExeception $e) { die("erreur!: " $e->;getMessage()); } /* On passe $pdo en global pour pouvoir l'utiliser à traver les classes */ global $pdo;
Certains utilisent l’héritage pour utiliser PDO dans leur classes mais je préfère ma méthode :).
Abordons désormais la classe en elle même. Elle est commentée en doc php. C’est les commentaires qui sont ainsi :
/**
* Commentaire
* @author SorenS
*/
D’ailleurs dans un futur proche vous aurez droit à un petit billet là dessus. J’ai découvert cela il n’y a pas longtemps et c’est quand même pas mal. Vous verrez ça améliore pas mal la lisibilité et ça a d’autres atouts. Enfin, on verra ça bientôt ;=)
Voici donc la classe commentée :
/** * Classe de gestion de membre * - Inscription avec diverses vérifications * - Récapitulatif du membre * - Génération de l'âge via la date de naissance (<em>source : <a href="http://blog.jaysalvat.com/articles/snippet-php-calculer-un-age-a-partir-date-de-naissance.php">ce billet</a></em>) * @author SorenS */ class Member{ /** * Login de l'utilisateur * @access private * @type String */ private $login; /** * Mot de passe de l'utilisateur * @access private * @type String || md5 */ private $password; /** * Adresse email de l'utilisateur * @access private * @type String */ private $mail; /** * Date de naissance de l'utilisateur * @type Timestamp */ private $birthDate; /* Méthodes classiques de la classe - get (prendre), set(modifier), display(afficher) */ /** * Méthode pour prendre un attribut de la classe * @access public * @param $attribute String Nom de l'attribut visé * @return Mixed */ public function __get($attribute){ // on vérifie que l'attribut demandé existe if(isset($this->$attribute)) $return = $this->$attribute; // on renvoi la valeur else $return = false; // on renvoi faux car l'attribut n'existe pas return $return; } /** * Méthode pour modifier un attribut * @access public * @param $attribute String Nom de l'attribut visé * @param $value Mixed Valeur désirée pour l'attribut visé * @return boolean */ public function __set($attribute, $value){ // on met $return a true $return = true; // on vérifie que l'attribut demandé existe if(isset($this->$attribute)) $this->$attribute = $value; // on remplace la valeur de l'attribut else $return = false; // on renvoi faux car l'attribut n'existe pas return $return; } /** * Méthode pour afficher la valeur de l'attribut désiré * @access public * @param $attribute String Nom de l'attribut visé * @return void */ public function display($attribute){ // on vérifie que l'attribut demandé existe if(isset($this->$attribute)) echo $this->$attribute; // on affiche la valeur de l'attribut désiré else echo 'Error : attribute not exist'; // affichage d'une erreur } /* Vérifications */ /** * Vérification de la taille d'une chaine (mot de passe ou login par exemple) * /!\ Pour la vérification de la longueur du mot de passe, il faut l'appeller * avant la fonction checkPassword /!\ * @access public * @param $attribute String Nom de l'attribut visé * @param $length Integer Longueur désirée pour la chaine * @return boolean */ public function checkLength($attribute, $length){ // Si la longueur de la chaine est trop petite if(strlen($this->$attribute) < $length) $return = false; // on retourne faux else $return = true; // sinon c'est ok return $return; } /** * Vérification de l'unicité du login * /!\ PDO requit /!\ * @access public * @return boolean */ public function checkLogin(){ // récupération du nombre d'occurrence du login $sql = "SELECT COUNT(*) AS count_pseudo FROM member WHERE login = '$this->login'"; $st = $GLOBALS['pdo']->query($sql); // passage en objet $result = $st->fetch(PDO::FETCH_OBJ); // si le login est libre if($result->count_pseudo == 0){ $return = true; } else{ // si pseudo déjà utilisé $return = false; } return $result; } /** * MD5 du mot de passe et suppression des espaces * @access public * @return void */ public function md5password(){ // on enlève les espaces en début et en fin de chaine $this->password = trim($this->password); // on md5 le mot de passe $this->password = md5($this->password); } /** * Vérification de la bonne forme de l'email * @access public * @return boolean */ public function checkMail(){ //regex de vérification du format de l'email if(preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]_?])*@[[:alnum:]]([-.]?[[:alnum:]])+\.([a-z]{2,6})$`',$this->mail)) $return = true; // ok else $return = false; // mauvais format return $return; } /** * Affichage de toute les infos de la classe * A utiliser en développement pas en production * Affichage brut des données * @access public * @return void */ public function displayAll(){ var_dump($this); } /** * Méthode pour sauvegarder le membre * A utiliser après les diverses méthodes check de préférence * /!\ PDO requit /!\ * Cette méthode doit sûrement être optimisable * @access public * @return boolean */ public function save(){ // requête sql $sql = "INSERT INTO member VALUES('','$this->;login','$this->password','$this->mail','$this->birthDate')"; $GLOBALS['pdo']->query($sql); try{ $GLOBALS['pdo']->query($sql); $return = true; }catch (Exception $e){ echo 'Error PDO : '$e; $return = false; } return $return; } }
Attention : il se peut que des bugs subsistent dans le code. N’oubliez pas que cela n’a pas pour but de servir pour du copier-coller
Si vous ne connaissez pas l’une des fonctions php utilisées (md5, strlen,…) cliquez dessus pour accéder au manuel PHP.
Je pense qu’il n’y a pas besoin de plus commenter. Si vous avez des optimisations, des avis, des critiques à émettre, n’hésitez pas.
See you later