Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Programmez en orienté objet en PHP

    4 septembre 2018 à 14:56:40

    Bonjour Anguilet. Merci pour ta réaction. 

    En fait, je n'ai pas modifié le fichier de configuration. Je t'apprends que j'ai retrouvé mon erreur et je l'ai corrigé.

    J'avais installé WAMP qui contient MySQL sur une autre version de MySQL Server.

    J'ai dû désinstaller les deux et réinstaller WAMP.

    Tout marche nikelle.

    Merci pour votre soutien.

    • Partager sur Facebook
    • Partager sur Twitter
    L'effort c'est ce qui nous coûte. N'ayons donc pas peur d'en faire si nous voulons avancer dans la vie !
      5 septembre 2018 à 2:32:41

      Salut, ah ok d'accord je comprends mieux d'ailleurs il est dit dans la documentation qu'il ne faut pas le faire de rien pour le soutirent, c'est normal je fais que rendre ce que d'autres ont déjà fais pour moi. De plus nous nommes une communauté. Content pour toi.
      • Partager sur Facebook
      • Partager sur Twitter
      Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
        8 septembre 2018 à 17:36:59

        Bonjour, et au secours !

        incroyable. La partie 3 est extrêmement difficile. Aidez moi. je ne sais même plus que poser comme question.

        En effet, j'ai tout les fichiers du Ste au complet. Je ne sais pas que faire avec ces fichiers. que dois-je maintenant faire stp? Peut-être mettre dans l'url: news-1.html ?.malheureusement ça me donne une erreur:Fatal error: Uncaught RuntimeException: La vue spécifiée n'existe pas in /Applications/MAMP/htdocs/app_poo_chap5/lib/OCFram/Page.php:23 

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2018 à 22:33:29

          bonjour tout le monde,

          Pourriez vous m'expliquer pourquoi dans ce code

          <?php
          
          class Personnage
          
          {
          
            private $_degats; // Les dégâts du personnage.
          
            private $_experience; // L'expérience du personnage.
          
            private $_force; // La force du personnage (plus elle est grande, plus l'attaque est puissante).
          
                  
          
            public function frapper($persoAFrapper)
          
            {
          
              $persoAFrapper->_degats += $this->_force;
          
            }
          
                  
          
            public function gagnerExperience()
          
            {
          
              // On ajoute 1 à notre attribut $_experience.
          
              $this->_experience = $this->_experience + 1;
          
            }
          
          }

          Dans la function frapper() le $ de degats n'est plus utilisé ? idem dans

          function gagnerExperience()

           expérience est utilisé sans le $ pourquoi la variable compléte est bien $_experience pourquoi utiliser seulement avec _ experience

          Merci beaucoup

          • Partager sur Facebook
          • Partager sur Twitter

          " Si vis pacem, para bellum "

            21 septembre 2018 à 1:32:21

            Parad0xJ, en fait c'est simple, la méthode frapper prend une instance de Personnage, la cible ici $persoAFrapper,donc la cible possède l'attribut degats et quand on accède à un attribut on ne met pas de $ sauf si c'est un attribut static met là c'est une autre histoire et le contexte n'est pas le même. Pour faire simple sache que les attributs ne prennent pas de $. Donc on a: (new Maclasse)->monAttribut/$objet->monAttribut. Jamais (new Maclasse)->$monAttribut/$objet->$monAttribut. J'espère t'avoir aidé.
            • Partager sur Facebook
            • Partager sur Twitter
            Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
              21 septembre 2018 à 1:37:32

              @StéphaneteAnguilet

              bonjour et Merci,

              Je pense avoir compris.  Merci de ton aide

              • Partager sur Facebook
              • Partager sur Twitter

              " Si vis pacem, para bellum "

                24 septembre 2018 à 13:23:05

                Pourquoi mettre en cache des données si on peut mettre en cache facilement une page affichée?

                Bonjour,

                J'ai commencé à travailler le tp final sur le système de cache. C'est un excellent exercice pour trouver la manière d'aller chercher des contenus de variable dans d'autres classes... Je ne suis creusé la tête à plusieurs moments! Je vais finir par comprendre comment fonctionne ce framework dans le menu détail!

                Après des recherches et un peu de bricolage, je suis capable de faire se créer des fichiers cache dans un répertoire pour  chaque vue affichée qui portent le nom de chaque vue. Il me fallait comprendre cet aspect du problème... Pour le moment, mon programme peut utiliser un cache ou s'il n'existe pas, il exécute les opérations normales pour générer la page et à la fin produit un cache utilisable à la requête suivante. Ces fichiers récupèrent bien la vue affichée (par exemple, show.php avec les données qu'elles comportent:  la news et ses commentaires. A l'enregistrement du cache, le nom du fichier porte déjà le id de la vue pour chaque news wt ses commentaires. Je n'ai pas encore travaillé, mais j'y viens, l'aspect périssable du fichier, mais un tuto trouvé sur openclassroom sur les caches montre que chaque fichier enregistre un peu secrètement un timestamp du moment de sa création et que l'on peut aisément se servir de cet disposition pour évaluer avec un test si le fichier est périmé.

                Ma question: je ne comprends toujours pas pourquoi il faudrait enregistrer des données en cache. Ce n'est pas clair. Quelqu'un peut-il éclairer ma lanterne?

                Merci d'avance!

                Francis

                • Partager sur Facebook
                • Partager sur Twitter
                Francis du Canada - Soyons audacieux!
                  24 septembre 2018 à 13:48:36

                  Bonjour Francis,

                  Brièvement, je dirais que le fait de récupérer les données en cache va éviter de faire une requête supplémentaire pour un résultat que l'on a déjà. Donc, on a un gain de temps et moins de risque de saturer le serveur si il y a des milliers de demande aux heures de pointes.

                  Bien à toi.

                  Philippe

                  • Partager sur Facebook
                  • Partager sur Twitter
                  La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                    24 septembre 2018 à 15:24:38

                    Merci Philippe,

                    Je comprends la raison d'un cache. Mais je mets déjà des vues associées à chaque affichage dans des fichiers de cache qui se créent après la «génération» de la vues avec les requêtes des infos (news et commentaires de la bdd): bref le code html de la page est enregistré dans un fichier HTML. Et si je reviens par la suite sur n'importe quel page, le cache de la vue, s'il existe, est d'abord utilisé. Bref, mon programme met déjà en cache des vues qui portent le nom et id de la news. Il les récupère grâce au nom du fichier de cache en question. Bon, pour le moment, tout se passe surtout dans la méthode run() de mon FrontendApplication.php, mais je devais comprendre, avant de me lancer dans la création d'une classe gérant le cache, comment je peut arriver à faire fonctionner le tout. Il me reste à mettre l'aspect périssable du cache en fonction et à organiser la classe cache et les méthodes qui regénènent ou créent des fichier de cache quand un nouveau commentaire ou une nouvelle news est créé...

                    Le sens de ma première question: je ne comprends toujours pas pourquoi il faut en plus mettre en cache des « données » sérialisées de plus en cache. Pour faire quoi au juste?

                    J'ai deux hypothèses:

                    1. Veut-on parler d'une sorte de array (annuaire des vues misee en cache avec leur date de péremption) qui serait mis en cache (d'où le besoin de sérialiser) aussi pour être facilement consulté au moment de la prise de décision du programme: on utilise le cache ou on génère la page avec des requête à la bdd?C'est un peu inutile, car chaque fichier de cache, lors de sa création, a déjà un timestamp associé facilement récupérable avec filemtime() pour permettre cette décision de l'appli, mais c'est peut-être pour les fins des objectifs de l'exercice que nous devrions le faire ainsi.

                    2. L'autre possibilité que je trouve un peu tordu: on devrait mettre en données sérialisés en cache  ce qui est dans la bdd pour chaque news et chaque commentaire et ainsi faire s'afficher les vues en cache en coordonnant le fichier de la vue et les données qu'il parse (si je comprend bien le sens de parser... je veux dire les : $news[''] et $comment['']. J'avoue que là , si c'est la tâche, je rame à savoir comment m'y prendre!

                    Merci de vos lumières.

                    Note à part: je bosse quotidiennement sur ce tuto depuis un bon mois de 6 à 8 heures. Pour un cours dit de 30 heures! Qui sont les génies qui le font en 30 heures. Je suis curieux!

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Francis du Canada - Soyons audacieux!
                      25 septembre 2018 à 5:17:34

                      Philippe 2463 et Chat Botté, je vous envie car vous êtes bien avancé dans ce TP poo. Je sais que grâce a votre acharnement au travail vous y arriverez.

                      soyez sensible à nous autre pommés qui ne trouvons pas les voies et qui sont dans les pénombres. Cela fait plus de deux moi à temps plein que je lis et relis toutes les pages du mooc poo. Ceci dit, lorsque je lance l'application, j'obtiens:DOCUMENT NON TROUVE. Après plus de deux mois de galères, j'en suis là. Merci pour les conseils que vous pourrez me donner. Si je le pouvais j'allais payer 300 ‎ pour être suivi par un tuteur mais hélas. j'attend avec impatience vos conseils.

                      -
                      Edité par DaoudaTraore5 25 septembre 2018 à 5:19:09

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 septembre 2018 à 12:52:21

                        Bon, j'ai trouvé en cherchant sur le Net qu'on peut fetcher des données à partir de la lecture d'un fichier.txt. Je donne la ressource (https://evertpot.com/107/) qui montre une classe cache qui utilise le système des fichiers, c'est en anglais, mais bon, on a Google maintenant!. C'est un vieil article de 2006, mais ce peut aider à comprendre le fonctionnement d'un cache dans le genre de ce qu'on doit produire. Ça utilise serialized comme on doit le faire. Néamoins, j'ai l'impression qu'on ne nous a pas parlé de __sleep et __wakeup pour rien... Pour d'autres, qui cherchent aussi à avancer dans ce tp, j'espère que vous avez comme moi trouvé l'intervention dans la présente section du forum vers les pages 15-20 qui donnent quelques précisions sur les zones de l'appli que l'installation d'une classe cache doit toucher. Il y a aussi un cours sur openclassroom sur l'installation d'un cache qui explique aussi la notion de temporisation qu'on doit saisir pour ce tp aussi, je pense.

                        Bon, je n'ai pas toujours la solution. Je dois mieux maitriser les fonctions reliées aux lecture, écriture de fichiers texte et comment gérer la sérialisation des données, leur récupération, etc. Faire des test dans cette appli complexe rend la chose assez ardue. var_dump() se fait aller pour suivre les flux et comprendre ce qui va de travers.

                        Daouda:

                        Moi aussi, j'ai connu 36 bugs en recopiant les fichiers. L'informatique est pire que la grammaire française, on peut toujours laisser des fautes et quelqu'un peut dire «T'as une faute», mais comprend néanmoins ton message.  En informatique, la moindre coquille te plante ton programme! Bon, je suis enseignant de français de métier, ça aide à voir les coquilles, j'ai de l'expérience!

                        Bref, pour trouver l'erreur, parfois il faut fouiller longtemps et évidemment il faut comprendre comment ça marche pour remonter à la source du problème. Par exemple, Daouba, si je relis ton message du 8 septembre (à ce moment, je ne pouvais t'aider je n'étais pas rendu là), ton problème a à voir avec la vue qui n'est pas trouvée: en fait ce message s'affiche si (!file_exists($this->contentFile): contentfile est vide, n'existe pas.

                        Il n'a pas de constructeur dans cette classe. Bref, filecontent doit être rempli par l'utilisation de la fonction setContentFile() plus bas dans la classe Page. Quelque part dans l'appli, un page->setContentFile ne réussit pas à faire son job. Tu peux lancer une recherche dans tous tes fichiers de l'appli dans ton éditeur pour trouver où cela se passe. Et tu arrives dans le backcontroller, il y a la fonction setView et là il y a le paramètre entré dans la fonction setContentFile(__DIR__.'/../../App/' . $this->app->name().'/Modules/' . $this->module . '/Views/' . $this->view . '.php'); S'il y a la moindre erreur dans cette adresse de ton dossier Views, ça ne va pas faire le boulot et le message que tu as eu va s'afficher. C'est comme si tu invites un nouvel ami à aller te voir en lui donnant une mauvaise adresse, il risque de ne pas trouver. Bon, s'il est débrouillard, il est moins bête qu'un programme, il sait parler et sait interagir avec d'autres humains, il va probablement te trouver pareil.Ton appli est un ensemble de lignes de codes, pas plus. C'est un moins gros miracle de la création que ton ami!

                        Aussi, il faut aussi que tes dossiers où tu mets tes vues soient bien là, dans la bonne hiérarchie sans aucune faute dans leur désignation: par exemple, pour tester ce que j'affirmais j'ai enlevé le s à /'Views'/ et bang! En plein ton message d'erreur. show.php qui est demandé par une url news-1... doit être là aussi, bien évidemment. Bon, je ne suis pas plus pro que toi, la source est peut-être ailleurs aussi, il faudra chercher  à comprendre en jouant au détective, moi c'est ce qui me rend l'informatique si intéressant, j'aime retrouver la source d'un problème en comprenant comment fonctionne des choses que je ne comprenais pas avant.

                        Alors mon conseil pour avancer dans ce cours, dans cette troisième partie. Retaper doucement, se relire 30 fois à chaque ligne! tout en essayant de comprendre ce qui se passe. (C'est évidemment très compliqué et complexe, mais petit à petit on développe une vision du fonctionnement de l'appli. Chercher la fonction utilisée qu'on ne connait pas au passage sur php.net, écrire un commentaire dans le code quand on saisit quelque chose. Quand on arrive à la fin du fichier. On peut effacer tout et copier celui du tuto et enregistrer. OU mieux:  laisser ça comme ça pour apprendre plus tard comment ton appli fonctionne en cherchant la source de chaque erreur. Remonte les flux comme je viens de le faire en utilisant var_dump(); exit; pour voir ce qui sort dans tes variables et aussi la fonction de recherche dans les fichiers qui te permet de trouver les sources du flux: d'où viennent les messages: string, bool, int, etc. en amont de l'erreur, car quelque part il y a une faute, c'est certain, on en laisse toujours... Des fois, le message d'erreur est clair, variable indéfini, on peut être sûr que la variable est mal écrite.

                        Fais des schémas sur une feuille: Ici, je prendrais peut-être en note de ce qui se passe:

                        BackController __construct -----> BackContr: setView() $this->page->contentfile(adresse de la vue) ---->  Page: getGeneratedPage().

                        A faire des schéma, tu te feras des représentations du fonctionnement de l'appli en suivant les flux.

                        Enfin, si après toute  ton enquête, ça ne débloque toujours pas, tu peux toujours reprendre le tuto et recopier le code de chaque fichier impliqué dans ton problème un à un. Moi, je testais, je mettais le fichier et regardais si ça réglait le problème. Puis, je remettais mon code et cherchait où j'avais merdé. Toujours pour comprendre comment ça marche.

                        Bon travail!

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Francis du Canada - Soyons audacieux!
                          27 septembre 2018 à 16:56:05

                          Bonjour à tous!

                          Je travaille actuellement sur le tuto et suis dans la partie 3.

                          J'ai voulu tester l'application après avoir codé le module News. (pas encore arrivé à l'ajout des commentaire)

                          J'ai eu plein de messages d'erreurs que j'ai réussi à résoudre mais là je butte sur une erreur et je m'arrache les cheveux....

                          J'ai certainement raté quelque chose sur autoload.php le fichier est bien présent dans le dossier Library ainsi que la classe Page.class.php...

                          Voici le code du fichier autoload.php

                          <?php
                          function autoload($class)
                          {
                            require '../'.str_replace('\\', '/', $class).'.class.php';
                          }
                          spl_autoload_register('autoload');

                          Quelqu'un aurait une piste?? Merci pour votre temps.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 septembre 2018 à 3:49:09

                            Salut fakir974, retire le '../'. dans '../'.str_replace('\\''/'$class).'.class.php'Au profit de str_replace('\\''/'$class).'.class.php';. Ensuite fait var_dump($class); dans autoload tu auras le chemin que ta fonction essaie de charger, si tu as des namespaces adapte la structure des tes dossiers à ces deniers et aussi il y a un cours sur les espaces de noms lis le si tu comprends pas je vais t'expliquer.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                              4 octobre 2018 à 16:49:24

                              bonjour!

                              Tout d'abord merci pour ce tuto!

                              Mais je bloque au niveau du quatrième chapitre.

                              J'ai essayé plusieurs solutions évoquées sur le forum mais je continue d'avoir cette satanée erreur ->

                              fatal erreur

                              voila mon code  :

                              class Personnage{
                              	
                              	private $_id;
                              	private $_nom;
                              	
                              	
                              	public function hydrate(array $donnees){
                              		foreach($donnees as $key => $value){
                              			$method = 'set'.ucfirst($key);
                              			
                              			if(method_exists($this, $method)){
                              				$this->$method($value);
                              			}
                              		}
                              	}
                              	
                              	public function __construct(array $donnees = array())
                              	{
                              		$this->hydrate($donnees);
                              	}
                              	
                              	public function id(){
                              		return $this->_id;
                              	}
                              	
                              	public function nom(){
                              		return $this->_nom;
                              	}
                              	
                              	public function afficheNom(){
                              		echo $this->_nom;
                              	}
                              	
                              	public function setId($id){
                              		$id = (int) $id;
                              		
                              		if($id > 0){
                              			return $this->_id = $id;
                              		}
                              	}
                              	
                              	public function setNom($nom){
                              		$nom = is_string($nom);
                              		
                              		if(is_string($nom)){
                              			return $this->_nom = $nom;
                              		}
                              	}
                              	
                              	
                              }
                              
                              
                              class PersonnagesManager{
                              	
                              	private $_db;
                              	
                              	public function __construct($db)
                              	{
                              		$this->setDb($db);
                              	}
                              	
                              	public function add(Personnage $perso){
                              		$req= $this->_db->prepare('INSERT INTO personnages (nom) value (:nom)');
                              		
                              		$req->bindValue(':nom', $perso->nom());
                              		$req->execute();
                              	}
                              	
                              	public function getList(){
                              	
                              		$persos = [];
                              		$q = $this->_db->query('SELECT id, nom FROM personnages ORDER BY nom');
                              
                              		while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
                              		{
                              		  $persos[] = new Personnage($donnees);
                              		}
                              		return var_dump($persos);
                              		
                              	}
                              	
                              	public function setDb(PDO $db){
                              		$this->_db = $db;
                              	}
                              	
                              }
                              
                              
                              $perso = new Personnage(['nom' => 'Victor']);
                              
                              
                              $db = new PDO('mysql:host=localhost;dbname=oc_poo_php', 'root', '');
                              $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                              $manager = new PersonnagesManager($db);
                              
                                  
                              
                              $manager->add($perso);

                              j'ai essayer la solution qu'Itahiro a proposé à Nicolas Galus

                              avec la variante

                              $perso->hydrate(['nom' =>'viktor'])

                              mais j'ai toujours la même erreur :'(

                              ma base:

                              base données

                              voilà je suis au bord de me jeter du pont d'à coté :ange:

                              Si vous pouviez m'aider je serais infiniment reconnaissant.

                              -
                              Edité par pixelblank 4 octobre 2018 à 16:52:42

                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 octobre 2018 à 2:38:48

                                Essaie VALUES à la place de «value» dans ta requête.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Francis du Canada - Soyons audacieux!
                                  5 octobre 2018 à 8:54:18

                                  Merci pour l'aide!

                                  Mais j'ai toujours la meme erreur! :'(

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 octobre 2018 à 16:29:18

                                    Désolé, je n'ai pas d'idées et je suis troublé en ce moment par ce que je découvre sur openClassroom...

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Francis du Canada - Soyons audacieux!
                                      5 octobre 2018 à 20:26:54

                                      je  me pose une question comment  faire pour  track  plusieurs models d un site web
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 octobre 2018 à 9:42:54 - Message modéré pour le motif suivant : Message complètement hors sujet


                                          6 octobre 2018 à 16:05:28

                                          pixelBlank: quand mes requêtes plantent, j'essaie de les passer (variables précisées) directement dans la base de donnée, parfois j'ai des surprises.

                                          Après, je fais des var_dump();exit; autour de la requête pour voir ce qui entre dans la requête, si les valeurs sont là. J'ai remarqué aussi que de préciser le type de variables dans le bindValue est nécessaire par moment surtout pour les integer, je le fais donc systématiquement.

                                          Enfin, quand mon code plante et que je n'arrive pas à en trouver la cause, je mets le code des corrigés s'il y en a par secteur du code pour voir quand ça va cesser de planter puis je reviens à mon code par un ctrl z et cherche mon erreur. Parfois, on ne voit plus rien. C'est en général un détail dérisoire qui fait tout aller de travers...

                                          Enfin, laisser tomber et revenir avec un regard frais est souvent une meilleure idée que de s'entêter!

                                          As-tu réglé ton problème?

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Francis du Canada - Soyons audacieux!
                                            7 octobre 2018 à 23:44:03

                                            Salut pixelblank montre la ligne 120 du fichier index.php s'il te plait.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                              8 octobre 2018 à 10:40:20

                                              Putain !!!!!! ça marche!!!!! c'est de la mega bombe!!!:zorro::p:D:lol:

                                              je met mon code du coup

                                              <?php
                                              
                                              
                                              class Personnage
                                              
                                              {
                                                private $_id;
                                                private $_nom;
                                                private $_forcePerso;
                                                private $_degats;
                                                private $_niveau;
                                                private $_experience;
                                              	
                                              	
                                              	public function __construct(array $donnees)
                                              		{
                                              			$this->hydrate($donnees);
                                              		}
                                                // Un tableau de données doit être passé à la fonction (d'où le préfixe « array »).
                                                public function hydrate(array $donnees)
                                                {
                                                 foreach ($donnees as $key => $value)
                                                {
                                                  // On récupère le nom du setter correspondant à l'attribut.
                                                  $method = 'set'.ucfirst($key);
                                                  // Si le setter correspondant existe.
                                                  if (method_exists($this, $method))
                                                  {
                                                    // On appelle le setter.
                                                    $this->$method($value);
                                                  }
                                                }
                                              
                                                }
                                              	
                                              
                                                public function id() { return $this->_id; }
                                                public function nom() { return $this->_nom; }
                                                public function forcePerso() { return $this->_forcePerso; }
                                                public function degats() { return $this->_degats; }
                                                public function niveau() { return $this->_niveau; }
                                                public function experience() { return $this->_experience; }
                                              
                                                public function setId($id)
                                                {
                                                  // L'identifiant du personnage sera, quoi qu'il arrive, un nombre entier.
                                                  $id = (int) $id;
                                                      if ($id>=0)
                                                      {
                                                          $this -> _id = $id;
                                                      }
                                                }
                                              
                                                public function setNom($nom)
                                                {
                                                  // On vérifie qu'il s'agit bien d'une chaîne de caractères.
                                                  // Dont la longueur est inférieure à 30 caractères.
                                                  if (is_string($nom))
                                                      {
                                                        $this->_nom = $nom;
                                                      }
                                                }
                                              
                                                public function setForcePerso($forcePerso)
                                                {
                                                  $forcePerso = (int) $forcePerso;
                                                  // On vérifie que la force passée est comprise entre 0 et 100.
                                                  if ($forcePerso >= 0 && $forcePerso <= 100)
                                                  {
                                                    $this->_forcePerso = $forcePerso;
                                                  }
                                                }
                                              
                                                public function setDegats($degats)
                                                {
                                                  $degats = (int) $degats;
                                                  // On vérifie que les dégâts passés sont compris entre 0 et 100.
                                                  if ($degats >= 0 && $degats <= 100)
                                                  {
                                                    $this->_degats = $degats;
                                                  }
                                                }
                                              
                                                public function setNiveau($niveau)
                                                {
                                                  $niveau = (int) $niveau;
                                                  // On vérifie que le niveau n'est pas négatif.
                                                  if ($niveau >= 0)
                                                  {
                                                    $this->_niveau = $niveau;
                                                  }
                                                }
                                              
                                                public function setExperience($experience)
                                                {
                                                  $experience = (int) $experience;
                                                  // On vérifie que l'expérience est comprise entre 0 et 100.
                                                  if ($experience >= 0 && $experience <= 100)
                                                  {
                                                    $this->_experience = $experience;
                                                  }
                                              
                                                }
                                              
                                              }
                                              
                                              
                                              class PersonnagesManager{
                                              	
                                              	private $_db;//instance de PDO
                                              	
                                              	public function __construct($db){
                                              		$this->setDb($db);
                                              	}
                                              	
                                              
                                              	public function add(Personnage $perso){
                                              		$q = $this->_db->prepare('INSERT INTO personnages (nom, forcePerso, degats, niveau, experience) VALUES (:nom, :forcePerso, :degats, :niveau, :experience)');
                                              		
                                              		$q->bindValue(':nom', $perso->nom());
                                              		$q->bindValue(':forcePerso', $perso->forcePerso());
                                              		$q->bindValue(':degats', $perso->degats());
                                              		$q->bindValue(':niveau', $perso->niveau());
                                              		$q->bindValue(':experience', $perso->experience());
                                              		
                                              		$q->execute();
                                              	
                                              	}
                                              	
                                              	public function delete(Personnage $perso){
                                              		$this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
                                              	}
                                              	
                                              	
                                              	public function get($id){
                                              		$id = (int) $id;
                                              		
                                              		$q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages WHERE id = '.$id);
                                              		
                                              		$donnees = $q->fetch(PDO::FETCH_ASSOC);
                                              		
                                              		return new Personnage($donnees);
                                              	}
                                              	
                                              	public function getList(){
                                              		$persos =[];
                                              		
                                              		$q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages ORDER BY nom');
                                              		
                                              		while($donnees = $q->fetch(PDO::FETCH_ASSOC)){
                                              			$persos[] = new Personnage($donnees);
                                              		}
                                              		
                                              		return $persos;
                                              		
                                              	}
                                              	
                                              	
                                              	
                                              	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();
                                              	}
                                              	
                                              	
                                              	
                                              	public function setDb(PDO $db){
                                              		$this->_db = $db;
                                              	}
                                              }
                                              
                                              
                                              
                                              $perso = new Personnage([
                                                'nom' => 'wesh',
                                                'forcePerso' => 5,
                                                'degats' => 3,
                                                'niveau' => 1,
                                                'experience' => 3
                                              ]);
                                              
                                              
                                              
                                              $db = new PDO('mysql:host=localhost;dbname=oc_poo_php', 'root', '');
                                              $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                              $manager = new PersonnagesManager($db);
                                              
                                              $manager->add($perso);
                                              
                                              

                                              j'avais oublié un "e" à execute

                                              -
                                              Edité par pixelblank 8 octobre 2018 à 12:02:06

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 octobre 2018 à 1:27:25

                                                Cool, lis bien les erreurs
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                                  9 octobre 2018 à 8:39:49

                                                  Pixelblank, bravo pour ton travail
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 octobre 2018 à 8:00:10

                                                    Bonjour à tous,

                                                    Je suis en train de suivre cet excellent tutoriel (qui se complique sacrément sur la fin lorsqu'on réinvente Symfony :p ) et je rencontre un problème sans doute tout bête à corriger, mais je n'y parviens pas.

                                                    Je suis à la fin du chapitre concernant le Frontend, j'ai placé l'ensemble de mon projet sous wamp64/www/tp3/. Pour y accéder, je saisis donc dans l'url de mon navigateur http://localhost/tp3/web/ (http://localhost/tp3/ ne me renvoyant que le contenu du répertoire).

                                                    Mon problème est que les URI retournées par $_SERVER['REQUEST_URI'] (à partir HTTPRequest::requestURI()) sont systématiquement des chaînes de caractères précédées de "/tp3/web", qui ne sont pas reconnues par mon router attendant "/", ou "/news-([0-9]+)\.html".

                                                    Si je modifie mon routes.xml avec des valeurs du type 

                                                    <route url="/tp3/web/" module="News" action="index" ></route>

                                                    ça va fonctionner, mais ça ne semble pas être la bonne solution...

                                                    Que dois-je faire ?

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 octobre 2018 à 10:44:21

                                                      HUHUGENESIS, en fait tu te poses la vraie question car effectivement en réglant convenablement ta configuration, tu obtiendras convenablement ta page d'accueil. Moi je travaille avec un macbook, donc impossible de d'aider pour la configuration. Surtout ne modifie pas les routes, ne modifie rien du tout. Continu de bien configurer ton localhost simplement et tout sera ok.

                                                      -
                                                      Edité par DaoudaTraore5 10 octobre 2018 à 10:48:03

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 octobre 2018 à 13:19:26

                                                        Pour configurer ton serveur, trouve le fichier httpd-vhosts.conf de ton serveur:  le mien est dans e:\wamp64\bin\apache\apache2.4.33\conf\extra et ouvre-le dans ton éditeur.

                                                        Ajoute en fonction de ton installation une entrée VirtualHost:

                                                        <VirtualHost *:80>
                                                        	ServerName monsupersite
                                                        	DocumentRoot "e:/wamp64/www/tp3/Web"
                                                        	<Directory  "e:/wamp64/www/tp3/Web">
                                                        		Options +Indexes +Includes +FollowSymLinks +MultiViews
                                                        		AllowOverride All
                                                        		Require local
                                                        	</Directory>
                                                        </VirtualHost>

                                                        Tu mets le nom que tu veux pour "monsupersite" et tu ajustes toujours ici les deux lignes suivantes si tu changes ton répertoire où tu mets ton appli. Moi ce fichier était toujours ouvert pendant ce cours (hé oui, je suis passé au travers!) dans un éditeur que je n'utilisais pas trop...

                                                        Redémarre tes services wamp.

                                                        Tape "monsupersite" dans le fureteur et tu vas tomber sur la page correspondant à ta route index.

                                                        Bon courage!



                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Francis du Canada - Soyons audacieux!
                                                          10 octobre 2018 à 18:12:59

                                                          Sauf erreur il faut aussi informer le fichier hosts - pour plus de détail sur ce fichier: cf Modifier son fichier hosts

                                                          Sous windows, il se trouve sous : DISQUE:\Windows\System32\drivers\etc\hosts

                                                          La ligne à ajouter, si on prend l'exemple ci-dessus, serait: 127.0.0.1 monsupersite

                                                           Une explication détaillée de Otomatic Wampserver et plusieurs sites que j'utilise sans problème depuis des années sous différentes versions de Wampserver qui me permet de gérer de nombreux "sites locaux". (en cherchant un peu on trouve d'autres explications similaire)

                                                          Attention à utiliser un éditeur de texte qui n'ajoute pas de caractères supplémentaires (par ex utiliser Notepad++, gratuit) et de relancer Wamp après chaque modif dans ces fichiers (ou sous la dernière version, clic droit/outils/redémarrage DNS)

                                                          A noter: dans cette configuration plus besoin de localhost/monsupersite; http://monsupersite devrait suffire

                                                          -
                                                          Edité par nanart 10 octobre 2018 à 18:19:39

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            10 octobre 2018 à 22:01:03

                                                            Maintenant que je vous lis ça me revient, j'avais sauté ce passage du tuto, après avoir galéré un moment, Windows m'empêchant de mettre à jour le fichier hosts :-°

                                                            En contournant le problème (en executant notepad en tant qu'admin) ça fonctionne !

                                                            @DaoudaTraore5, Chat Botté et nanart merci pour votre aide !

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              11 octobre 2018 à 19:27:53

                                                              Chat Botté ainsi que tous les futurs développeurs, merci de contribuer à l'évolutions de la planète en renseignant vos semblables. je continue toujours avec acharnement à comprendre ce tp. J'ai relu plus de 30 fois l'application, mais cette fois-ci je viens de repérer mon problème. En effet je ne comprends pas du tout les class :Manager et Managers. les mots:"$dao" dans Mamager et "api" dans Managers sont un très gros blocage pour moi. D'ou viennent ces mots? Ils ont été parachutés? J'avoue que j'ai du manquer quelque chose. Et puis toujours dans Managers, cet attribut "protected $manager =[]". A quel moment se tableau prendra pour valeur "News"? quelle fonction remplira ce tableau?

                                                              Dernière question:$this->managers[$module] = new $manager($this->dao);. ON INSTANCIE QUOI? un attribut? il est possible d'instancier "$manager"? Si oui alors là je crois qu'il faut que je reprenne mes cours.

                                                               Merci pour vos aides.


                                                              -
                                                              Edité par DaoudaTraore5 11 octobre 2018 à 19:43:11

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              MOOC Programmez en orienté objet en PHP

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown