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 :

UPDATE sur un objet $perso dont les attributs ne change pas


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 43
    Points
    43
    Par défaut UPDATE sur un objet $perso dont les attributs ne change pas
    Bonjour,

    N'obtenant pas de réponse ailleurs je tente ma chang ici...
    J'ai un problème avec le cours Programmez en orienté objet en PHP et plus particulièrement avec le TP intitulé Mini jeu de combat.

    Voici le code qui me pose problème il s'agit du UPDATE de $perso.

    .
    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
    ..
    $retour = $perso->frapper($persoAFrapper); // On stocke dans $retour les éventuelles erreurs ou messages que renvoie la méthode frapper.
     
          switch ($retour)
          {
            case Personnage::CEST_MOI :
              $message = 'Mais... pourquoi voulez-vous vous frapper ???';
              break;
     
            case Personnage::PERSONNAGE_FRAPPE :
              $message = 'Le personnage a bien été frappé !';
     
              $manager->update($perso);
              $manager->update($persoAFrapper);
     
              break;
     
            case Personnage::PERSONNAGE_TUE :
              $message = 'Vous avez tué ce personnage !';
     
              $manager->update($perso);
              $manager->delete($persoAFrapper);
     
              break;
          }
    ...
    En effet lorsque $perso attaque persoAFrapper aucun "paramètre" (attribut) de $perso ne change. Alors pourquoi faire un UPDATE sur ce personnage ? Par contre $persoAFrapper lui voit son attribut $_degats modifié suite à l'attaque donc un UPDATE de ce personnage est nécessaire pour enregistrer dans la base la nouvelle valeur de $degats...

    Merci d'avance pour votre aide...

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Merci on n'est pas une poubelle

    Le perso qui frappe gagne de l'experience quand il frappe non ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 43
    Points
    43
    Par défaut
    Eh bien non !. Effectivement si l'objet $perso gagnait de l'expérience en frappant $persoAFrapper le UPDATE se justifierait. Mais ce n'est pas le cas ici...
    Voici la classe Personnage dans laquelle il n'y a pas d'attribut $_expérience.

    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
    <?php
    class Personnage
    {
      private $_degats,
              $_id,
              $_nom;
     
      const CEST_MOI = 1; // Constante renvoyée par la méthode `frapper` si on se frappe soi-même.
      const PERSONNAGE_TUE = 2; // Constante renvoyée par la méthode `frapper` si on a tué le personnage en le frappant.
      const PERSONNAGE_FRAPPE = 3; // Constante renvoyée par la méthode `frapper` si on a bien frappé le personnage.
     
     
      public function __construct(array $donnees)
      {
        $this->hydrate($donnees);
      }
     
      public function frapper(Personnage $perso)
      {
        if ($perso->id() == $this->_id)
        {
          return self::CEST_MOI;
        }
     
        // On indique au personnage qu'il doit recevoir des dégâts.
        // Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE
        return $perso->recevoirDegats();
      }
     
      public function hydrate(array $donnees)
      {
        foreach ($donnees as $key => $value)
        {
          $method = 'set'.ucfirst($key);
     
          if (method_exists($this, $method))
          {
            $this->$method($value);
          }
        }
      }
     
      public function recevoirDegats()
      {
        $this->_degats += 5;
     
        // Si on a 100 de dégâts ou plus, on dit que le personnage a été tué.
        if ($this->_degats >= 100)
        {
          return self::PERSONNAGE_TUE;
        }
     
        // Sinon, on se contente de dire que le personnage a bien été frappé.
        return self::PERSONNAGE_FRAPPE;
      }
     
     
      // GETTERS //
     
     
      public function degats()
      {
        return $this->_degats;
      }
     
      public function id()
      {
        return $this->_id;
      }
     
      public function nom()
      {
        return $this->_nom;
      }
     
      public function setDegats($degats)
      {
        $degats = (int) $degats;
     
        if ($degats >= 0 && $degats <= 100)
        {
          $this->_degats = $degats;
        }
      }
     
      public function setId($id)
      {
        $id = (int) $id;
     
        if ($id > 0)
        {
          $this->_id = $id;
        }
      }
     
      public function setNom($nom)
      {
        if (is_string($nom))
        {
          $this->_nom = $nom;
        }
      }
    }
    Et voici le code SQL de la base utilisée pour le TP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `personnages` (
      `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
      `nom` varchar(50) COLLATE utf8_general_ci NOT NULL,
      `degats` tinyint(3) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      UNIQUE KEY `nom` (`nom`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
    Et toujours pas de champ 'expérience'...
    Encore merci pour votre aide...

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas ça ta méthode update ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function update(Personnage $perso)
    {
    $q = $this->_db->prepare('UPDATE personnages SET forcePerso =
    :forcePerso, degats = :degats, niveau = :niveau, experience =
    :experience WHERE id = :id');
    $q->bindValue(':forcePerso', $perso->forcePerso(),
    PDO::PARAM_INT);
    $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
    $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT);
    $q->bindValue(':experience', $perso->experience(),
    PDO::PARAM_INT);
    $q->bindValue(':id', $perso->id(), PDO::PARAM_INT);
    $q->execute();
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 43
    Points
    43
    Par défaut
    Pas du tout. Je n'ai pas cette méthode dans ma classe PersonnagesManager.
    Ma méthode UPDATE est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function update(Personnage $perso)
      {
    ...
        $q = $this->_db->prepare('UPDATE personnages SET degats = :degats WHERE id = :id');
     
        $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT);
        $q->bindValue(':id', $perso->id(), PDO::PARAM_INT);
     
        $q->execute();
    ...
      }
    Désolé de vous contredire et encore merci pour votre aide...

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne sais pas si c'est la dernière version de l'article d'origine mais on trouve ici une version beaucoup plus dense du TP :
    http://thomashenrywarner.free.fr/eBo...jet-en-php.pdf
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 43
    Points
    43
    Par défaut
    J'observe que dans le document correspondant au lien que vous me donné les attributs et les méthodes sont strictement identiques au code sur lequel je travaille. Donc toujours pas d'attribut $_experience.
    Encore merci beaucoup pour le temps que vous accepter de passer pour me répondre.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    On ne doit pas avoir les mêmes yeux
    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
    <?php
    class
    Personnage
    {
    private
    $_force
    ;
    // La force du personnage
    private
    $_localisation
    ;
    // Sa localisation
    private
    $_experience
    ;
    // Son expérience
    private
    $_degats
    ;
    // Ses dégâts
    }
    ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 39
    Points : 43
    Points
    43
    Par défaut
    Oui en effet ce code est présent au début du cours Programmez en orienté objet en PHP chapitre Utiliser la classe.
    Mais cette classe n'est pas reprise dans le TP. Dans le TP la classe Personnage est différente et correspondant à celle que je vous ai donné précédemment.
    Si la classe Personnage était celle du début du cours et non celle du TP alors oui la fonction UPDATE est nécessaire sinon elle ne sert à rien, c'est du moins ce que je pense...

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

Discussions similaires

  1. Problèmes de calage sur mon site perso avec les nouveaux navigateurs
    Par safeerbandali dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 24/07/2011, 00h28
  2. Réponses: 2
    Dernier message: 22/05/2009, 03h54
  3. Réponses: 0
    Dernier message: 17/03/2009, 19h02
  4. Enregistrement d'objet persos dans les settings
    Par skylvl dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/03/2007, 15h32
  5. Comment afficher une form dont les dimensions ne dépendent pas de la résolution sous
    Par The Freestyler Fou dans le forum Vos contributions VB6
    Réponses: 1
    Dernier message: 10/09/2005, 16h05

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