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

PHP & Base de données Discussion :

Mise à jour en base de données - bonnes pratiques [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut Mise à jour en base de données - bonnes pratiques
    Bonjour,

    J'ai une question qui concerne les bonnes pratiques en PHP.
    J'utilise la classe suivante :

    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
     
    class contact 
    { 
       	private $id;
       	private $titre;
    	private $prenom;
     	private $nom;
     
    /** 
    * Méthode de mise à jour de l'objet en base de données 
    */ 
     
      public function update() { 
        $sSQL = "UPDATE contacts SET titre = :titre, prenom = :prenom, nom = :nom WHERE id = :id"; 
        try { 
            $core = Core::getInstance();  
            $stmt = $core->dbh->prepare($sSQL);  
            $stmt->bindValue(':id', $this->id, PDO::PARAM_INT);  
            $stmt->bindValue(':prenom', $this->getPrenom(), PDO::PARAM_STR);  
            $stmt->bindValue(':nom', $this->getNom(), PDO::PARAM_STR);  
            $stmt->execute();  
            return true;
        } catch (PDOException $e) { 
        	throw new Exception($e->getMessage()); 
        } 
      } 
    }
    Le formulaire suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form action="traitement.php" method="get">	
    	<input type="hidden" name="id" value="<?=$oContact->getId()?>" />
    	<label for="prenom">Prénom</label><input type="text" name="prenom" value="<?=$oContact->getPrenom()?>" />
    	<input type="submit" value="Enregistrer" />
    </form>
    La page traitement.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $oContact = new contact();
    $oContact->setId($_REQUEST["id"]);
    $oContact->setPrenom($_REQUEST["prenom"]);
    if ($oContact->update()) echo "Enregistrement terminé.";

    Le problème, c'est que je ne souhaite mettre à jour que le champ prénom. Sans modifier le champ nom.

    Quelle est la bonne manière de faire une méthode update() qui ne met à jour que les champs demandés :
    - Je relis les données en base, avant de mettre à jour l'objet dans traitement.php ; problème : ça me semble être une lecture de base sans réel intérêt, qui impacte inutilement les performance.
    - Je construis la chaîne $sSQL de la classe, pour ne mettre à jour que les attributs non-null. problème : il m'arrive qu'un formulaire permette de passer volontairement un attribut à NULL. Et dans ce cas la méthode ne tiendra pas compte de ce champ.

    Avez-vous une autre idée ?
    Merci pour votre aide,

    Gillou.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    le plus pratique c'est de bien séparer les concepts de leur implémentation.
    Dans ta classe Contact tu mélanges un peu tout.

    Tu peux factoriser tous les accès à la base de données, la validation et faire en sorte que le SQL s'écrive tout seul en fonction d'un paramétrage dynamique.

    Par exemple au lieu de figer les attributs de tes contacts dans une classe, tu peux très utiliser un tableau qui ne contient que les clés à mettre à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Contact::update(array(
        'id'     => 25,
        'titre'  => 'abc',
        'prenom' => 'def'
    ));
    Et le sql correspondant qui s'écrirait dynamiquement bien sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'UPDATE t_contact SET titre = :titre, prenom = :prenom WHERE id = :id';
    Y a un vrai travail de conception à faire derrière mais le résultat est très souple.

  3. #3
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    Bonjour et merci pour ta réponse.

    Ta méthode est intéressante.
    Tu utilises donc une méthode static pour la mise à jour.
    Par contre elle met à jour la base de données, sans mettre à jour l'objet.
    J'ai l'impression qu'on perd l'un des intérêts de la POO, non ?

    Gillou.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Le plus simple c'est d'allier les deux : tu n'est pas obligé de créer un objet spécifique à chaque table. Tu peux très bien créer un DTO (Data Transfert Object) générique qui sera passé à tes fonctions :
    quelque chose dans ce genre :
    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
    <?php 
     
    class DTO 
    {
        private $data = array();
     
        public function setData(array $p) 
        {
            $this->data = $p;
        }
     
        public function getData() 
        {
            return $this->data;
        }    
     
        /* d'autres fonctions utiles : collecte des erreurs de validation par exemple ...*/
    }
     
    $contact = new DTO();
    $contact->setData(array(
        'id'     => 25,
        'titre'  => 'abc',
        'prenom' => 'def'
    ));
     
    Contact::update($contact);
    Le but de la manoeuvre c'est d'éviter que tu aies trop d'objets spécifiques à coder : PHP est flexible et cela serait dommage de s'en priver surtout de l'utilisation des tableaux.
    La conséquence : plus tu utilises la flexibilité de PHP et plus tu dois mettre le paquet sur le PHPDOC. Tes fonctions doivent être soigneusement commentées de manière à éviter d'avoir à les lire pour savoir ce qui est attendu.

    Après, pour éviter un truc lourdingue il faut aussi partir du principe que le développeur n'est pas un âne non plus.

  5. #5
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    Je te remercie pour ces informations.
    A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Cours pt-05]Moteur de mise à jour de base de données
    Par Papy Turbo dans le forum Sondages et Débats
    Réponses: 38
    Dernier message: 29/10/2007, 19h02
  2. Mise à Jour Champ Base de Donnée
    Par arjo54 dans le forum IHM
    Réponses: 0
    Dernier message: 10/10/2007, 15h38
  3. [MySQL] Mise à jour dynamique base de données
    Par Lili72430 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/09/2007, 12h36
  4. Requête de mise à jour - Ouverture base de données
    Par ade94 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/05/2007, 16h50
  5. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38

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