IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

idée amélioration gestion erreur et code pour class php5


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut idée amélioration gestion erreur et code pour class php5
    comme convenu je montre les fruits de mon travail sur les categories d'un site ecommerce en php5.
    Je prenderai toute suggestion pour l'ameliorer.
    un peu long excusez moi mais beaucoup de répétition.

    class.categorie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    <?php
     
    class Categorie
    {   
    	private $id;
    	private $titre;
    	private $description;
    	private $estActive;
    	private $estDansMenu;
    	private $dateModification;
    	private $dateCreation;
    	private $idSupCategorie;
    	private $erreurs = array();
     
    	  /**
             * Constantes relatives aux erreurs possibles rencontrées lors de l'exécution de la méthode
             */
     
    	const TITRE_INVALIDE = 1;
    	const DESCRIPTION_INVALIDE = 2;
    	const CONTENU_INVALIDE = 3;
    	const ESTACTIVE_INVALIDE = 4;
    	const ESTDANSMENU_INVALIDE = 5;
    	const DATEMODIFICATION_INVALIDE = 6;
    	const DATECREATION_INVALIDE = 7;*/
    	/**
    		* Constructeur de la classe Personnage
    		* @param $donnees array Les valeurs à assigner au personnage
    		* @return void
    		*/
     
    	public function __construct(array $donnees)
    	{
    		$this->DonnerProprietes($donnees);
     
    	}
     
    	/**
    		* Méthode permettant d'assigner les valeurs aux attributs
    		* @param $donnees array Les valeurs à assigner
    		* @return void
    		*/
    	public function DonnerProprietes(array $donnees)
    	{
    		//on parcourt le tableau $donnees et la clé de l'élément courant est copiée dans $key tandis que sa valeur est copiée dans $value!
    		foreach ($donnees as $key => $value)
    		{
    			//switch équivaut à une série d'instructions if sur la key
    			switch ($key)
    			{
    				/*1 cas id: la cle vaut la valeur $value de type int*/
    			case 'id':
    				$this->$key = (int) $value;
    				break;
    				/*2 cas titre: la cle vaut la valeur $value de type string*/    
    			case 'titre':
    				$this->titre = (string) $value;
    				break;
    				/*3 cas description: la cle vaut la valeur $value de type string*/		
    			....
    			}
    		}
    	}
     
    	/**
    		* Méthode permettant de savoir si la categorie est nouvelle
    		* @return bool
    		*/
    	public function isCategorie()
    	{
    		return empty($this->id);
    	}
     
    	/**
    		* Méthode permettant de savoir si la categorie est valide
    		* @return bool
    		*/
    	public function isValid()
    	{
    		return !(empty($this->titre) || empty($this->description));
    	}
     
     
    	// SETTERS //
     
    	public function setId($id)
    	{
    		$this->id = (int) $id;
    	}
     
     
    	public function setTitre($titre)
    	{
    		if (!is_string($titre) || empty($titre))
    		$this->erreurs[] = self::TITRE_INVALIDE;
    		else
    		$this->titre = $titre;
    	}
     
    	public function setDescription($description)
    	{
    		if (!is_string($description) || empty($description))
    		$this->erreurs[] = self::CONTENU_INVALIDE;
    		else
    		$this->description = $description;
    	}
    	....
     
     
    	// GETTERS 
     
    public function erreurs()
            {
                return $this->erreurs;
            }
     
    	public function getId() {
    		return (int) $this->id;
    	}
     
    	public function getTitre() {
    		return (string) $this->titre;
    	}
     
    	public function getDescription() {
    		return (string) $this->description;
    	}
     
    	....
     
    	public function getDateModifcation($dateModif)
    	{
    		if (is_string($dateModif) && preg_match('`le [0-9]{2}/[0-9]{2}/[0-9]{4} à [0-9]{2}h[0-9]{2}`', $dateModif))
    		$this->date_Modif = $dateModif;
    	}
     
    	...
     
    }
    ?>
    categorieManager.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    <?php
    /**
    	*class qui va permettre de faire le lien entre la BDD et la categorie
    	**/ 
    class CategorieManager
    {
    	/**
    		* Attribut contenant l'instance représentant la BDD
    		* @type PDO
    		*/
     
    	private $db; 
    	/**
    		* Constructeur étant chargé d'enregistrer l'instance de PDO dans l'attribut $db
    		**/
     
     
    	public function __construct($db)
    	{
    		$this->db = $db;
    	}
     
     
     
    	/**
    		* Méthode permettant d'ajouter une categorie
    		* @param $categorie Categorie La categorie à ajouter
    		* @return vide
    		*/
     
     
    	protected function add(Categorie $categorie)
    	{
    		$requete = $this->db->prepare('INSERT INTO categorie SET titre = :titre, description = :description,estActive = :estActive, estDansMenu = :estDansMenu,dateModification = :dateModification, dateCreation = :dateCreation,idSupCategorie = :idSupCategorie');
     
    		$requete->bindValue(':titre', $categorie->titre());
    		$requete->bindValue(':description', $categorie->description());
    		$requete->bindValue(':estActive', $categorie->estActive());
    		$requete->bindValue(':estDansMenu', $categorie->estDansMenu());
    		$requete->bindValue(':dateModification', $categorie->dateModification());
    		$requete->bindValue(':dateCreation', $categorie->dateCreation());
    		$requete->bindValue(':idSupCategorie', $categorie->idSupCategorie());
     
    		$requete->execute();
    	}
     
    	/**
    		* Méthode renvoyant le nombre de categorie total
    		* @return int
    		*/
     
    	public function count()
    	{
    		return $this->db->query('SELECT COUNT(*) FROM categorie')->fetchColumn();
    	}
     
    	/**
    		* Méthode permettant de supprimer une categorie
    		* @param $id int L'identifiant de la categorie à supprimer
    		* @return vide
    		*/
     
    	public function delete($id)
    	{
    		$requete = $this->db->prepare('DELETE FROM categorie WHERE id = :id');
     
    		$requete->bindValue(':id', $id, PDO::PARAM_INT);
     
    		$requete->execute();
    	}
     
    	/**
    		* Méthode retournant une liste de categorie demandée
    		* @param $debut int La première categorie à sélectionner
    		* @param $limite int Le nombre de categorie à sélectionner
    		* @return array La liste des categorie. Chaque categorie entrée est une instance de categorie.
    		*/
     
    	public function getList($debut = -1, $limite = -1)
    	{
    		$listeCategorie = array();
     
    		$sql = 'SELECT id ,titre ,description ,estActive ,estDansMenu ,DATE_FORMAT (dateModification, \'le %d/%m/%Y à %Hh%i\') as dateModification, DATE_FORMAT (dateCreation, \'le %d/%m/%Y à %Hh%i\') AS dateCreation ,idSupCategorie FROM categorie ORDER BY id DESC';
     
     
    		if ($debut != -1 || $limite != -1)
    		$sql .= ' LIMIT ' . (int) $debut . ', ' . (int) $limite;
     
    		$requete = $this->db->query($sql);
     
    		while ($categorie = $requete->fetch(PDO::FETCH_ASSOC))
    		$listeCategorie[] = new Categorie ($categorie);
     
    		$requete->closeCursor();
     
    		return $listeCategorie;
    	}
     
    	/**
    		* Méthode retournant une categorie précise
    		* @param $id int L'identifiant de la categorie à récupérer
    		* @return Categorie La categorie demandée
    		*/
     
    	public function getUnique($id)
    	{
    		$requete = $this->db->prepare('SELECT id ,titre ,description ,estActive ,estDansMenu ,DATE_FORMAT (dateModification, \'le %d/%m/%Y à %Hh%i\') as dateModification, DATE_FORMAT (dateCreation, \'le %d/%m/%Y à %Hh%i\') AS dateCreation ,idSupCategorie  FROM categorie WHERE id = ?');
    		$requete->bindValue(':id', (int) $id, PDO::PARAM_INT);
    		$requete->execute();
     
    		return new Categorie($requete->fetch(PDO::FETCH_ASSOC));
    	}
     
    	/**
    		* Méthode permettant d'enregistrer une categorie
    		* @param $Categorie Categorie la categorie à enregistrer
    		* @voir function add()
    		* @voir fonction modify()
    		* @return vide
    		*/
    	public function save(Categorie $categorie)
    	{
    		if ($categorie->isValid())
    		{
    			$categorie->isCategorie() ? $this->add($categorie) : $this->update($categorie);
    		}
    		else
    		{
    			throw new RuntimeException('La categorie doit être valide pour être enregistrée');
    		}
    	}
     
    	/**
    		* Méthode permettant de modifier une categorie
    		* @param $categorie categorie la categorie à modifier
    		* @return vide
    		*/
     
    	protected function update(Categorie $Categorie)
    	{
    		$requete = $this->db->prepare('UPDATE categorie SET titre = :titre, description = :description ,estActive = :estActive, estDansMenu = :estDansMenu,dateModification = NOW(),idSupCategorie = :idSupCategorie WHERE id = :id');
     
    		$requete->bindValue(':titre', $Categorie->titre());
    		$requete->bindValue(':description', $Categorie->description());
    		$requete->bindValue(':estActive', $Categorie->estActive());
    		$requete->bindValue(':estDansMenu', $Categorie->estDansMenu());
    		$requete->bindValue(':dateModification', $Categorie->dateModification());
    		$requete->bindValue(':idSupCategorie', $Categorie->idSupCategorie());
    		$requete->bindValue(':id', $Categorie->id(), PDO::PARAM_INT);
     
    		$requete->execute();
    	}
    }
    ?>
    J’ai travaillé sur le tuto de POO du site zero avec comme modèle le tp de news.
    Petite question pourquoi a t-il mit les attributs en protected dans ce tuto, car je croyais que c’était important qu'il soit en private?

    MERCI POUR TOUS VOS CONSEILS.

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par kate59 Voir le message
    petite question pk a t-il mit les attribut en protected dans ce tuto, car je croyais que c etait important qu'il soit en private?
    Un attribut de type protected d'une classe mère peut être utilisé dans une classe fille à la différence d'un attribut de type private.

    L'usage veut également (mais à toi de voir) que les attributs de classe soit préfixés d'un underscore afin de les différencier rapidement des autres variables.


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            private $_id;
    	private $_titre;
    	private $_description;
    	private $_estActive;
    	private $_estDansMenu;
    	private $_dateModification;
    	private $_dateCreation;
    	private $_idSupCategorie;
    	private $_erreurs = array();

    Mais bon, c'est nullement obligatoire

  3. #3
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    merci et que pense tu de la gestion d'erreur?

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Ca me semble correct dans la théorie, reste à savoir comment tu utilises ton tableau d'erreurs ensuite dans la pratique. Tu boucles dessus et affiches toutes les erreurs ?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    comment tu gères les erreurs de PDO ?

  6. #6
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    exemple dans mon admin.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    ..
     if (isset ($_POST['categorie']))
        {
            $categorie = new categorie (
                array (
     
                    'titre' => $_POST['titre'],
                    'description' => $_POST['description']
                )
            );
     
            if (isset ($_POST['id']))
                $categorie->setId($_POST['id']);
     
            if ($categorie->isValid())
            {
                $manager->save($categorie);
     
                $message = $categorie->isCategorie() ? 'La categorie a bien été ajoutée !' : 'La categorie a bien été modifiée !';
            }
            else
                $erreurs = $categorie->erreurs();
        }
    ...
     
     <?php if (isset($erreurs) && in_array(categorie::TITRE_INVALIDE, $erreurs)) echo 'Le titre est invalide.<br />'; ?>
                    Titre : <input type="text" name="titre" value="<?php if (isset($categorie)) echo $categorie->getTitre(); ?>" /><br />
     
                    <?php if (isset($erreurs) && in_array(categorie::DESCRIPTION_INVALIDE, $erreurs)) echo 'La description est invalide.<br />'; ?>
                    Description :<br /><textarea rows="8" cols="60" name="description"><?php if (isset($categorie)) echo $categorie->getDescription(); ?></textarea><br />
    ?>

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    si tu fais un
    getUnique(0)

    ca donne quoi ?


    EDIT : par contre ca c'est pas top
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($categorie = $requete->fetch(PDO::FETCH_ASSOC))
    $listeCategorie[] = new Categorie ($categorie);
     
    $requete->closeCursor();
    fais juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $listeCategorie = fetchAll(PDO::FETCH_CLASS, 'Categorie');

  8. #8
    Membre éprouvé
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Par défaut
    Je ne l'ai pas encore fait je suis au début en PDO mais si tu a des conseils par rapport à mon cas? tu parle d'exceptions c’est ça?

Discussions similaires

  1. [XL-2013] Erreur sur code pour copier-coller en valeur
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/01/2015, 09h55
  2. Erreur gestion excel via code VBA dans access pour importation
    Par blacklolou dans le forum VBA Access
    Réponses: 4
    Dernier message: 11/01/2013, 10h24
  3. plusieurs erreurs de code pour faire 2 totaux après une selection
    Par aprentizorrrr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2010, 22h29
  4. Gestion erreur dans module de class E97
    Par Eric_03 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/12/2008, 16h45
  5. [Cookies] Erreur de code pour un site multilangue
    Par MaTTuX_ dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2007, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo