Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Programmez en orienté objet en PHP

    11 juillet 2017 à 13:58:32

    jissey a écrit:

    Pour ma part, j'ai une question d'écriture que je ne comprends pas :

    j'en suis au 2eme TP (créer les classes magiciens et guerrier), et je ne comprends pas une écriture :

    return $this->timeEndormi > time();

    c'est une condition qui renvoie  l'heure de reveil (enfin l'heure à laquelle se réveille le perso si elle est plus grande que l'heure actuelle) ? j'ai jamais vu pour le moment timeEndormi > time()

    Oui j'ai déjà check cette doc mais je ne comprends toujours pas la "magie" qui opère sans les setters :p (mais j'ai réglé le problème de doublons, ça tourne, c'es juste de la curiosité mtn ^^)

    Pour ta ligne de code, la fonction retourne 'true' si "timeEndormi" est plus grand que "time()" 

    • Partager sur Facebook
    • Partager sur Twitter
      11 juillet 2017 à 15:58:18

      jissey a écrit:

      j'en suis au 2eme TP (créer les classes magiciens et guerrier), et je ne comprends pas une écriture :

      return $this->timeEndormi > time();

      c'est une condition qui renvoie  l'heure de reveil (enfin l'heure à laquelle se réveille le perso si elle est plus grande que l'heure actuelle) ? j'ai jamais vu pour le moment timeEndormi > time()

      Bonjour,
      J'ai suivi ce cours voici trop longtemps pour être sûr de ma réponse.
      Mais, à priori, non, cette condition ne devrait pas renvoyer "l'heure" mais un booléen.
      A savoir si l'heure de réveil est supérieure à l'heure actuelle... (ou pas)

      Edit: to late ;-)

      -
      Edité par nanart 11 juillet 2017 à 16:04:20

      • Partager sur Facebook
      • Partager sur Twitter
        11 juillet 2017 à 22:48:48

        Yo tous le monde,

        Je commence le php avec les bases de données, et j'arrive pas à récupérer les infos qu'elle contienne.

        Si quelqu'un peut m'aider :D

                $reponse = $pdo->query('SELECT * FROM client');
                $donnees = $reponse->fetch();
        	echo $donnees['name'] . '<br />';
        	var_dump($donnees);
        	while ($donnees = $reponse->fetch())
        	{
        		echo $donnees['name'] . '<br />';
        	}

        C'est la partie "echo $donnees['name'] . '<br />';" qui ne marche pas.

        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2017 à 0:35:31

          juste comme ça, ça fonctionne pas? :honte:  :

          $reponse = $pdo->query('SELECT * FROM client');
          
          while ($donnees = $reponse->fetch())
          {
              echo $donnees['name'] . '<br />';
          }



          -
          Edité par Karolyn 12 juillet 2017 à 0:42:07

          • Partager sur Facebook
          • Partager sur Twitter
            13 juillet 2017 à 17:19:48

            lvdesign a écrit:

            Bonjour, je viens de terminer le dernier TP.

            Voici ce que l'on devrait avoir comme consigne pour réussir ce TP.

            Avec ces directives, la réalisation de ce TP serait intéressante.

            J'ai corrigé trois TP, cela va dans tous les sens. C'est ridicule; Donc voici la demarche à suivre :

            -
            Edité par lvdesign 6 janvier 2017 à 11:39:35

            Un très grand merci à toi pour ce post car je galère vraiment à comprendre les consignes... MERCI MERCI MERCI

            Et franchement, RESPECT à tous ceux qui ont terminé cette activité sans cette aide !!!

            (Par contre, j'ai commencé par mettre en cache les données et cela m'a apparemment induite en erreur... 

            En effet, j'ai choisi de créer, ou lire ou supprimer les fichiers de mise en cache des données dans les managers (en utilisant les méthode de ma classe Cache qui gère les mises en cache : écriture, lecture et suppression d'un fichier de mise en cache)

            C'est en passant à la mise en cache des vues que je me suis aperçue que cela n'allait pas modifier les mêmes classes que pour la mise en cache des données. J'ai bien peur de devoir tout recommencer....

            mais merci quand même ;) )

            Après mûre réflexion, j'ai décidé de ne pas toucher à ce que j'ai déjà fait (la mise en cache des données via les managers), et je vais m'attaquer à la mise en cache des vues en modifiant cette fois-ci le BackController (et les autres classes, sous-entendues dans les consignes originales de la partie sur la mise en cache des vues).

            Je n'ai pas fini mais je me rapproche de la fin.

            ces consignes m'ont vraiment été d'une aide précieuse, je vous les conseilles.

            encore, merci

            -
            Edité par Squirrel Jo 25 juillet 2017 à 16:28:03

            • Partager sur Facebook
            • Partager sur Twitter
              17 juillet 2017 à 13:35:55

              j'ai deja lu un cours PHP de la fac

              je compte prendre celui d'ici, j'espere m'en sortir

              • Partager sur Facebook
              • Partager sur Twitter

              <root/>

                17 juillet 2017 à 13:58:17

                Salut à tous !

                Tout d'abord merci à Victor pour son cours. Cela ne doit pas être simple a expliquer.


                Je viens vous voir car je suis bloqué sur la partie Manipulation de données stockées - gérer sa BDD correctement.

                J'ai reproduit ce qui a été fait dans le cours mais cela ne fonctionne pas.  C'est à dire que mes données ne sont pas ajouté dans ma BDD et je parviens pas à trouvé mon erreur malgré relecture et tests. 2 jours que je bloque dessus alors j'abandonne ^^


                Pouvez-vous m'aider ?

                Voici le code :

                <?php
                
                // Partie "Programmez en orienté objet en PHP - Manipulation de données stockées "
                
                // nom de la classe & du fichier provisoir car dans le cours il l'appelle Personnage alors que le fichier précédant porte déjà ce nom.. A voir
                // Finalment j'appelle ma classe Personnage malgré tout
                
                
                class Personnage
                {
                	private $_id;
                	private $_nom;
                	private $_forcePerso;
                	private $_degats;
                	private $_niveau;
                	private $_experience;
                
                	//Un tableau de données doit être passé à la fonciton 
                	// $donnees est la variable qui représente les résultat après avoir fait un fetch après connexion à la BDD
                	public function hydrate(array $donnees)
                	{
                		/*
                		Facon de faire pour chaque champs:
                		if(isset($donnees['id']))
                		{
                			$this->setId($donnees['id']);
                		}
                		...
                		L'inconvénient c'est pas pratique si des champs viennent s'ajouter
                		
                		On préviligie donc l'utilisation d'une boucle qui vérifie si le setter correspondant à la clé existe
                		*/
                		foreach ($donnees as $key => $value) 
                		{
                			$method = 'set'.ucfirst($key);
                			
                			if(method_exists($this, $method))
                			{
                				// On appelle le setter
                				$this->$method($value);
                			}
                		}
                	}
                
                
                	// ACCESSEUR (Getters)
                	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;
                	}
                
                
                	// MUTATEUR (Setters)
                	public function setId($id)
                	{
                		// On convertit l'argument en nombre entier. Rien ne change si c'est déjà un entier, sinon a conversion donne 0
                		$id = (int) $id; 
                
                		if($id > 0)
                		{
                			$this->_id = $id;
                		}
                	}
                
                	public function setNom($nom)
                	{
                		if(is_string($nom))
                		{
                			$this->_nom = $nom;
                		}
                
                	}
                
                	public function setForcePerso($forcePerso)
                	{
                		$forcePerso = (int) $forcePerso;
                
                		if($forcePerso >= 1 && $forcePerso <= 100)
                		{
                			$this->_forcePerso = $forcePerso;
                		}
                
                	}
                
                	public function setDegats($degats)
                	{
                		$degats = (int) $degats;
                
                		if($degats >= 0 && $degats <= 100)
                		{
                			$this->_degats = $degats;
                		}
                	}
                
                	public function setNiveau($niveau)
                	{
                		$niveau = (int) $niveau;
                
                		if($niveau >= 1 && $niveau <= 100)
                		{
                			$this->_niveau = $niveau;
                		}
                	}
                	
                
                	public function setExperience($exp)
                	{
                		$exp = (int) $exp;
                
                		if($exp >= 0 && $exp <= 100)
                		{
                			$this->_experience = $exp;
                		}
                	}
                
                }
                
                
                require 'PersonnagesManager.php'; // J'inclus la classe manager
                
                
                $perso = new Personnage([
                	'nom' => 'toto',
                	'forcePerso' => 5,
                	'degats' => 1,
                	'niveau' => 1,
                	'experience' => 1
                	]);
                
                try 
                { 
                	$db = new PDO('mysql:host=localhost;dbname=bdd_test', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                } 
                catch(Exception $e) 
                { 
                	die('Erreur : '.$e->getMessage());
                }
                
                $manager = new PersonnagesManager($db);
                
                //$manager = new PersonnagesManager();
                
                $manager->add($perso);
                
                
                
                ?>
                

                Ma classe manager:

                <?php
                
                class PersonnagesManager	  
                {
                	private $_db; // Attribut qui va servir à représenter la connexion à la BDD (= instance de PDO)
                	private $_texte = "texte de test";
                
                	// Création d'un constructeur pour assigner à notre attribut un objet PDO dès l'instanciation du manager
                	public function __construct($db) 
                	{
                		$this->setDb($db);
                	}
                
                	// Getter temporaire
                	public function texte()
                	{
                		return $this->_texte;
                	}
                
                	// Méthodes
                	public function add(Personnage $perso)
                	{
                		// Préparation de la requête d'insertion
                		// Assignation des valeur pour le nom, la force, les dégâts, l'expérience et le niveau du personnage
                		// Exécution de la requête
                		$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(), 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->execute();
                		
                		/*
                		$q->execute(array (
                						'nom' => $perso->nom(),
                						'forcePerso' => $perso->forcePerso(),
                						'degats' => $perso->degats(),
                						'niveau' =>  $perso->niveau(),
                						'experience' => $perso->experience()
                						));
                		*/	
                
                	}
                
                
                	public function delete(Personnage $perso)
                	{
                		// Exécution d'une requête de type DELETE
                		
                		$q = $this->_db->prepare('DELETE FROM personnages WHERE id = ?');
                		// Autre façon de faire que bindValue utilisé juste avant
                		$q->execute(array($perso->id()));
                		
                		// $this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
                	}
                
                	public function get($id)
                	{
                		// Exécute une requête de type SELECT avec une clause WHERE et retourne un objet Personnage
                		$id = (int) $id;
                		
                		$q = $this->_db->prepare('SELECT * FROM personnages WHERE id = ?');
                		
                		$q->execute(array($perso>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()
                	{
                		// retourne la liste de tous les personnages
                		$persos = [];
                
                		$q = $this->_db->query('SELECT id, nom, forcePerso, dégats, niveau, experience FROM personnages ODER BY nom');
                
                		while($donnees = $q->fetch(PDO::FETCH_ASSOC))
                		{
                			$persos[] = new Personnage($donnees);
                		}
                
                		return $persos;
                	}
                
                	public function update(Personnage $perso)
                	{
                		// Prépare une requête de type UPDATE
                		// Assignation des valeurs à la requête
                		// Exécution de la requête
                		$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();
                	}
                
                		// Mutateur
                	public function  setDb(PDO $db) 
                	{
                		$this->_db = $db;
                	}
                
                
                }
                
                ?>


                Ma BDD :

                CREATE TABLE `personnages` (
                  `id` int(11) NOT NULL,
                  `nom` varchar(255) NOT NULL,
                  `forcePerso` int(11) NOT NULL,
                  `degats` int(11) NOT NULL,
                  `niveau` int(11) NOT NULL,
                  `experience` int(11) NOT NULL
                ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=' Programmez en orienté objet en PHP Manipulation de données ';
                

                Et le message d'erreur que j'ai après exécution de ma page:

                Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nom' cannot be null' in /opt/lampp/htdocs/poo/PersonnagesManager.php:57 Stack trace: #0 /opt/lampp/htdocs/poo/PersonnagesManager.php(57): PDOStatement->execute() #1 /opt/lampp/htdocs/poo/PersonnagesBDD.php(168): PersonnagesManager->add(Object(Personnage)) #2 {main} thrown in /opt/lampp/htdocs/poo/PersonnagesManager.php on line 57

                J'ai tenté de cherché des cas similaire sur les forums mais j'ai trouvé me solutionnant.

                PS :  c'est mon premier post sur le forum alors si il manque quelque chose, n'hésitez pas à me le dire. J'ai essayé de faire aussi clair que possible.


                Merci par avance à ceux qui sauront m'aider :)

                Nicolas


                • Partager sur Facebook
                • Partager sur Twitter
                  17 juillet 2017 à 18:03:47

                  LindowTeidara a écrit:

                  j'ai deja lu un cours PHP de la fac

                  je compte prendre celui d'ici, j'espere m'en sortir


                  Je te conseille plutôt de commencer par "Concevez votre site web en PHP et Mysql"
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juillet 2017 à 18:52:05

                    nicorellier10 a écrit:

                    Salut à tous !

                    Tout d'abord merci à Victor pour son cours. Cela ne doit pas être simple a expliquer.


                    Je viens vous voir car je suis bloqué sur la partie Manipulation de données stockées - gérer sa BDD correctement.

                    J'ai reproduit ce qui a été fait dans le cours mais cela ne fonctionne pas.  C'est à dire que mes données ne sont pas ajouté dans ma BDD et je parviens pas à trouvé mon erreur malgré relecture et tests. 2 jours que je bloque dessus alors j'abandonne ^^


                    Pouvez-vous m'aider ?

                    Voici le code :

                    <?php
                    
                    // Partie "Programmez en orienté objet en PHP - Manipulation de données stockées "
                    
                    // nom de la classe & du fichier provisoir car dans le cours il l'appelle Personnage alors que le fichier précédant porte déjà ce nom.. A voir
                    // Finalment j'appelle ma classe Personnage malgré tout
                    
                    
                    class Personnage
                    {
                    	private $_id;
                    	private $_nom;
                    	private $_forcePerso;
                    	private $_degats;
                    	private $_niveau;
                    	private $_experience;
                    
                    	//Un tableau de données doit être passé à la fonciton 
                    	// $donnees est la variable qui représente les résultat après avoir fait un fetch après connexion à la BDD
                    	public function hydrate(array $donnees)
                    	{
                    		/*
                    		Facon de faire pour chaque champs:
                    		if(isset($donnees['id']))
                    		{
                    			$this->setId($donnees['id']);
                    		}
                    		...
                    		L'inconvénient c'est pas pratique si des champs viennent s'ajouter
                    		
                    		On préviligie donc l'utilisation d'une boucle qui vérifie si le setter correspondant à la clé existe
                    		*/
                    		foreach ($donnees as $key => $value) 
                    		{
                    			$method = 'set'.ucfirst($key);
                    			
                    			if(method_exists($this, $method))
                    			{
                    				// On appelle le setter
                    				$this->$method($value);
                    			}
                    		}
                    	}
                    
                    
                    	// ACCESSEUR (Getters)
                    	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;
                    	}
                    
                    
                    	// MUTATEUR (Setters)
                    	public function setId($id)
                    	{
                    		// On convertit l'argument en nombre entier. Rien ne change si c'est déjà un entier, sinon a conversion donne 0
                    		$id = (int) $id; 
                    
                    		if($id > 0)
                    		{
                    			$this->_id = $id;
                    		}
                    	}
                    
                    	public function setNom($nom)
                    	{
                    		if(is_string($nom))
                    		{
                    			$this->_nom = $nom;
                    		}
                    
                    	}
                    
                    	public function setForcePerso($forcePerso)
                    	{
                    		$forcePerso = (int) $forcePerso;
                    
                    		if($forcePerso >= 1 && $forcePerso <= 100)
                    		{
                    			$this->_forcePerso = $forcePerso;
                    		}
                    
                    	}
                    
                    	public function setDegats($degats)
                    	{
                    		$degats = (int) $degats;
                    
                    		if($degats >= 0 && $degats <= 100)
                    		{
                    			$this->_degats = $degats;
                    		}
                    	}
                    
                    	public function setNiveau($niveau)
                    	{
                    		$niveau = (int) $niveau;
                    
                    		if($niveau >= 1 && $niveau <= 100)
                    		{
                    			$this->_niveau = $niveau;
                    		}
                    	}
                    	
                    
                    	public function setExperience($exp)
                    	{
                    		$exp = (int) $exp;
                    
                    		if($exp >= 0 && $exp <= 100)
                    		{
                    			$this->_experience = $exp;
                    		}
                    	}
                    
                    }
                    
                    
                    require 'PersonnagesManager.php'; // J'inclus la classe manager
                    
                    
                    $perso = new Personnage([
                    	'nom' => 'toto',
                    	'forcePerso' => 5,
                    	'degats' => 1,
                    	'niveau' => 1,
                    	'experience' => 1
                    	]);
                    
                    try 
                    { 
                    	$db = new PDO('mysql:host=localhost;dbname=bdd_test', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                    } 
                    catch(Exception $e) 
                    { 
                    	die('Erreur : '.$e->getMessage());
                    }
                    
                    $manager = new PersonnagesManager($db);
                    
                    //$manager = new PersonnagesManager();
                    
                    $manager->add($perso);
                    
                    
                    
                    ?>
                    

                    Ma classe manager:

                    <?php
                    
                    class PersonnagesManager	  
                    {
                    	private $_db; // Attribut qui va servir à représenter la connexion à la BDD (= instance de PDO)
                    	private $_texte = "texte de test";
                    
                    	// Création d'un constructeur pour assigner à notre attribut un objet PDO dès l'instanciation du manager
                    	public function __construct($db) 
                    	{
                    		$this->setDb($db);
                    	}
                    
                    	// Getter temporaire
                    	public function texte()
                    	{
                    		return $this->_texte;
                    	}
                    
                    	// Méthodes
                    	public function add(Personnage $perso)
                    	{
                    		// Préparation de la requête d'insertion
                    		// Assignation des valeur pour le nom, la force, les dégâts, l'expérience et le niveau du personnage
                    		// Exécution de la requête
                    		$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(), 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->execute();
                    		
                    		/*
                    		$q->execute(array (
                    						'nom' => $perso->nom(),
                    						'forcePerso' => $perso->forcePerso(),
                    						'degats' => $perso->degats(),
                    						'niveau' =>  $perso->niveau(),
                    						'experience' => $perso->experience()
                    						));
                    		*/	
                    
                    	}
                    
                    
                    	public function delete(Personnage $perso)
                    	{
                    		// Exécution d'une requête de type DELETE
                    		
                    		$q = $this->_db->prepare('DELETE FROM personnages WHERE id = ?');
                    		// Autre façon de faire que bindValue utilisé juste avant
                    		$q->execute(array($perso->id()));
                    		
                    		// $this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
                    	}
                    
                    	public function get($id)
                    	{
                    		// Exécute une requête de type SELECT avec une clause WHERE et retourne un objet Personnage
                    		$id = (int) $id;
                    		
                    		$q = $this->_db->prepare('SELECT * FROM personnages WHERE id = ?');
                    		
                    		$q->execute(array($perso>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()
                    	{
                    		// retourne la liste de tous les personnages
                    		$persos = [];
                    
                    		$q = $this->_db->query('SELECT id, nom, forcePerso, dégats, niveau, experience FROM personnages ODER BY nom');
                    
                    		while($donnees = $q->fetch(PDO::FETCH_ASSOC))
                    		{
                    			$persos[] = new Personnage($donnees);
                    		}
                    
                    		return $persos;
                    	}
                    
                    	public function update(Personnage $perso)
                    	{
                    		// Prépare une requête de type UPDATE
                    		// Assignation des valeurs à la requête
                    		// Exécution de la requête
                    		$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();
                    	}
                    
                    		// Mutateur
                    	public function  setDb(PDO $db) 
                    	{
                    		$this->_db = $db;
                    	}
                    
                    
                    }
                    
                    ?>


                    Ma BDD :

                    CREATE TABLE `personnages` (
                      `id` int(11) NOT NULL,
                      `nom` varchar(255) NOT NULL,
                      `forcePerso` int(11) NOT NULL,
                      `degats` int(11) NOT NULL,
                      `niveau` int(11) NOT NULL,
                      `experience` int(11) NOT NULL
                    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=' Programmez en orienté objet en PHP Manipulation de données ';
                    

                    Et le message d'erreur que j'ai après exécution de ma page:

                    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nom' cannot be null' in /opt/lampp/htdocs/poo/PersonnagesManager.php:57 Stack trace: #0 /opt/lampp/htdocs/poo/PersonnagesManager.php(57): PDOStatement->execute() #1 /opt/lampp/htdocs/poo/PersonnagesBDD.php(168): PersonnagesManager->add(Object(Personnage)) #2 {main} thrown in /opt/lampp/htdocs/poo/PersonnagesManager.php on line 57

                    J'ai tenté de cherché des cas similaire sur les forums mais j'ai trouvé me solutionnant.

                    PS :  c'est mon premier post sur le forum alors si il manque quelque chose, n'hésitez pas à me le dire. J'ai essayé de faire aussi clair que possible.


                    Merci par avance à ceux qui sauront m'aider :)

                    Nicolas


                    Quand c est comme ca pour essayer de deboguer utilise un var_dump ou print_r pour la variable $perso

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juillet 2017 à 20:40:37

                      ChristopheGatelet a écrit:

                      nicorellier10 a écrit:

                      Salut à tous !

                      Tout d'abord merci à Victor pour son cours. Cela ne doit pas être simple a expliquer.


                      Je viens vous voir car je suis bloqué sur la partie Manipulation de données stockées - gérer sa BDD correctement.

                      J'ai reproduit ce qui a été fait dans le cours mais cela ne fonctionne pas.  C'est à dire que mes données ne sont pas ajouté dans ma BDD et je parviens pas à trouvé mon erreur malgré relecture et tests. 2 jours que je bloque dessus alors j'abandonne ^^


                      Pouvez-vous m'aider ?

                      Voici le code :

                      <?php
                      
                      // Partie "Programmez en orienté objet en PHP - Manipulation de données stockées "
                      
                      // nom de la classe & du fichier provisoir car dans le cours il l'appelle Personnage alors que le fichier précédant porte déjà ce nom.. A voir
                      // Finalment j'appelle ma classe Personnage malgré tout
                      
                      
                      class Personnage
                      {
                      	private $_id;
                      	private $_nom;
                      	private $_forcePerso;
                      	private $_degats;
                      	private $_niveau;
                      	private $_experience;
                      
                      	//Un tableau de données doit être passé à la fonciton 
                      	// $donnees est la variable qui représente les résultat après avoir fait un fetch après connexion à la BDD
                      	public function hydrate(array $donnees)
                      	{
                      		/*
                      		Facon de faire pour chaque champs:
                      		if(isset($donnees['id']))
                      		{
                      			$this->setId($donnees['id']);
                      		}
                      		...
                      		L'inconvénient c'est pas pratique si des champs viennent s'ajouter
                      		
                      		On préviligie donc l'utilisation d'une boucle qui vérifie si le setter correspondant à la clé existe
                      		*/
                      		foreach ($donnees as $key => $value) 
                      		{
                      			$method = 'set'.ucfirst($key);
                      			
                      			if(method_exists($this, $method))
                      			{
                      				// On appelle le setter
                      				$this->$method($value);
                      			}
                      		}
                      	}
                      
                      
                      	// ACCESSEUR (Getters)
                      	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;
                      	}
                      
                      
                      	// MUTATEUR (Setters)
                      	public function setId($id)
                      	{
                      		// On convertit l'argument en nombre entier. Rien ne change si c'est déjà un entier, sinon a conversion donne 0
                      		$id = (int) $id; 
                      
                      		if($id > 0)
                      		{
                      			$this->_id = $id;
                      		}
                      	}
                      
                      	public function setNom($nom)
                      	{
                      		if(is_string($nom))
                      		{
                      			$this->_nom = $nom;
                      		}
                      
                      	}
                      
                      	public function setForcePerso($forcePerso)
                      	{
                      		$forcePerso = (int) $forcePerso;
                      
                      		if($forcePerso >= 1 && $forcePerso <= 100)
                      		{
                      			$this->_forcePerso = $forcePerso;
                      		}
                      
                      	}
                      
                      	public function setDegats($degats)
                      	{
                      		$degats = (int) $degats;
                      
                      		if($degats >= 0 && $degats <= 100)
                      		{
                      			$this->_degats = $degats;
                      		}
                      	}
                      
                      	public function setNiveau($niveau)
                      	{
                      		$niveau = (int) $niveau;
                      
                      		if($niveau >= 1 && $niveau <= 100)
                      		{
                      			$this->_niveau = $niveau;
                      		}
                      	}
                      	
                      
                      	public function setExperience($exp)
                      	{
                      		$exp = (int) $exp;
                      
                      		if($exp >= 0 && $exp <= 100)
                      		{
                      			$this->_experience = $exp;
                      		}
                      	}
                      
                      }
                      
                      
                      require 'PersonnagesManager.php'; // J'inclus la classe manager
                      
                      
                      $perso = new Personnage([
                      	'nom' => 'toto',
                      	'forcePerso' => 5,
                      	'degats' => 1,
                      	'niveau' => 1,
                      	'experience' => 1
                      	]);
                      
                      try 
                      { 
                      	$db = new PDO('mysql:host=localhost;dbname=bdd_test', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                      } 
                      catch(Exception $e) 
                      { 
                      	die('Erreur : '.$e->getMessage());
                      }
                      
                      $manager = new PersonnagesManager($db);
                      
                      //$manager = new PersonnagesManager();
                      
                      $manager->add($perso);
                      
                      
                      
                      ?>
                      

                      Ma classe manager:

                      <?php
                      
                      class PersonnagesManager	  
                      {
                      	private $_db; // Attribut qui va servir à représenter la connexion à la BDD (= instance de PDO)
                      	private $_texte = "texte de test";
                      
                      	// Création d'un constructeur pour assigner à notre attribut un objet PDO dès l'instanciation du manager
                      	public function __construct($db) 
                      	{
                      		$this->setDb($db);
                      	}
                      
                      	// Getter temporaire
                      	public function texte()
                      	{
                      		return $this->_texte;
                      	}
                      
                      	// Méthodes
                      	public function add(Personnage $perso)
                      	{
                      		// Préparation de la requête d'insertion
                      		// Assignation des valeur pour le nom, la force, les dégâts, l'expérience et le niveau du personnage
                      		// Exécution de la requête
                      		$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(), 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->execute();
                      		
                      		/*
                      		$q->execute(array (
                      						'nom' => $perso->nom(),
                      						'forcePerso' => $perso->forcePerso(),
                      						'degats' => $perso->degats(),
                      						'niveau' =>  $perso->niveau(),
                      						'experience' => $perso->experience()
                      						));
                      		*/	
                      
                      	}
                      
                      
                      	public function delete(Personnage $perso)
                      	{
                      		// Exécution d'une requête de type DELETE
                      		
                      		$q = $this->_db->prepare('DELETE FROM personnages WHERE id = ?');
                      		// Autre façon de faire que bindValue utilisé juste avant
                      		$q->execute(array($perso->id()));
                      		
                      		// $this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
                      	}
                      
                      	public function get($id)
                      	{
                      		// Exécute une requête de type SELECT avec une clause WHERE et retourne un objet Personnage
                      		$id = (int) $id;
                      		
                      		$q = $this->_db->prepare('SELECT * FROM personnages WHERE id = ?');
                      		
                      		$q->execute(array($perso>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()
                      	{
                      		// retourne la liste de tous les personnages
                      		$persos = [];
                      
                      		$q = $this->_db->query('SELECT id, nom, forcePerso, dégats, niveau, experience FROM personnages ODER BY nom');
                      
                      		while($donnees = $q->fetch(PDO::FETCH_ASSOC))
                      		{
                      			$persos[] = new Personnage($donnees);
                      		}
                      
                      		return $persos;
                      	}
                      
                      	public function update(Personnage $perso)
                      	{
                      		// Prépare une requête de type UPDATE
                      		// Assignation des valeurs à la requête
                      		// Exécution de la requête
                      		$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();
                      	}
                      
                      		// Mutateur
                      	public function  setDb(PDO $db) 
                      	{
                      		$this->_db = $db;
                      	}
                      
                      
                      }
                      
                      ?>


                      Ma BDD :

                      CREATE TABLE `personnages` (
                        `id` int(11) NOT NULL,
                        `nom` varchar(255) NOT NULL,
                        `forcePerso` int(11) NOT NULL,
                        `degats` int(11) NOT NULL,
                        `niveau` int(11) NOT NULL,
                        `experience` int(11) NOT NULL
                      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=' Programmez en orienté objet en PHP Manipulation de données ';
                      

                      Et le message d'erreur que j'ai après exécution de ma page:

                      Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nom' cannot be null' in /opt/lampp/htdocs/poo/PersonnagesManager.php:57 Stack trace: #0 /opt/lampp/htdocs/poo/PersonnagesManager.php(57): PDOStatement->execute() #1 /opt/lampp/htdocs/poo/PersonnagesBDD.php(168): PersonnagesManager->add(Object(Personnage)) #2 {main} thrown in /opt/lampp/htdocs/poo/PersonnagesManager.php on line 57

                      J'ai tenté de cherché des cas similaire sur les forums mais j'ai trouvé me solutionnant.

                      PS :  c'est mon premier post sur le forum alors si il manque quelque chose, n'hésitez pas à me le dire. J'ai essayé de faire aussi clair que possible.


                      Merci par avance à ceux qui sauront m'aider :)

                      Nicolas


                      Quand c est comme ca pour essayer de deboguer utilise un var_dump ou print_r pour la variable $perso


                      Merci Christophe pour ta réponse.
                      (Dommage que sur le forum on puisse pas citer que ta réponse. On va se retrouver avec un pavé énome à la fin)

                      C'est ce que j'ai fait après avoir compris comment l'utiliser. Entre le fait que cela soit un objet et un tableau, c'était un peu confus au début.

                      Voici la réponse à mon dump_value:
                      Code : var_dump($perso);
                      Je le met comme ça car j''ai juste rajouté ça après l'indentation de ma classe Personnage et avant la tentative de connexion à ma BDD

                      Après exécution de la page, cela me retournait que toutes mes valeur son NULL mais je comprend pas pourquoi. 


                      Je suis tombé sur un commentaire intéressant de nullegaltrue en page 18 de ce post qui semble intéressant. (J'ai pas le recul pour juger la pertinence car c'st encore un peu brouillon dans ma tête)
                      Donc  j'ai remplacé mon hydrate par __contruct, sans rien modifier d'autres, les données sont bien ajouté à la BDD et j'ai plus le problème. Sauf pour ID qui lui est en auto incrémente) :
                      object(Personnage)#1 (6) { ["_id":"Personnage":private]=> NULL ["_nom":"Personnage":private]=> string(3) "Moe" ["_forcePerso":"Personnage":private]=> int(1) ["_degats":"Personnage":private]=> int(0) ["_niveau":"Personnage":private]=> int(1) ["_experience":"Personnage":private]=> int(0) }

                      Alors j'ai du mal à comprendre. Je sais pas si ce sont les notions qui ne sont pas encore assez claire ou une erreur ou incompréhension dans le cours.


                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juillet 2017 à 23:31:50


                        nicorellier10 a écrit:

                        (Dommage que sur le forum on puisse pas citer que ta réponse. On va se retrouver avec un pavé énome à la fin)

                        Ben, si c'est possible... ;-)
                        Faut un peu "bidouiller".
                        En supprimant ce qui n'est pas indispensable,

                        puis, en cliquant sur le petit 'HTML', en bas à gauche de la fenêtre de rédaction
                        pour rajouter une balise <p>..</p> avec un début de texte
                        juste après la balise </blockquote> qui termine... la citation

                        ---

                        Autre solution:

                        On indique le nom de l'auteur de la citation + un copier coller de la citation.
                        Pas la même présentation, mébon, on peut quand même préférer ça à une longue liste de texte avec ou sans code ;-)

                        Ex:
                        nicorellier10 a écrit:
                        (Dommage que sur le forum on puisse pas citer que ta réponse. On va se retrouver avec un pavé énome à la fin)
                        ---

                        + en entourant la citation d'une balise <blockquote>, on devrait retrouver la même mise en forme
                        ---

                        (Dommage que sur le forum on puisse pas citer que ta réponse. On va se retrouver avec un pavé énome à la fin)

                        Edit
                        -----

                         J'ai trouvé une explication plus simple là: https://openclassrooms.com/forum/sujet/comment-citer-un-post-dans-le-forum#message-87836807

                        -
                        Edité par nanart 17 juillet 2017 à 23:49:08

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 juillet 2017 à 10:43:23

                          Bonjour, 

                          J'en suis à l'activité de la dernière partie de POO

                          J'ai besoin de vous pour comprendre le fonctionnement de la  fonction exit() dans la méthode send() de la classe HTTPResponse.

                          // envoie la réponse en générant la page 
                            public function send() 
                            {
                              exit($this->page->getGeneratedPage());
                            }

                          Dans le manuel PHP, exit est définit comme suit :

                          exit — Affiche un message et termine le script courant

                          Description ¶

                          void exit ([ string $status ] )
                          void exit ( int $status )

                          Termine le script courant. Les fonctions d'extinction et les destructeurs d'objets seront toujours exécutés même si exit est appelé.

                          exit est une construction de langage et peut être appelé sans parenthèse si aucun paramètre status n'est passé.

                          Liste de paramètres ¶

                          status

                          Si status est une chaîne de caractères, cette fonction affichera le status juste avant de sortir.

                          Si le paramètre status est un entier, cette valeur pourra être utilisée comme statut de sortie et ne sera pas affichée. Le statut de sortie peut être dans l'intervalle 0-255, le statut de sortie 255 est réservé par PHP et ne doit pas être utilisé. Le statut 0 est utilisé pour terminer le programme avec succès.

                          Quand je lit le code de la fonction send(), je comprends que la page est générée puis que le script est arrêté. Est-ce que je me trompe ?

                          Merci :)

                          -
                          Edité par Squirrel Jo 20 juillet 2017 à 18:44:21

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 juillet 2017 à 18:55:40

                            nicorellier10 a écrit:


                            Alors j'ai du mal à comprendre. Je sais pas si ce sont les notions qui ne sont pas encore assez claire ou une erreur ou incompréhension dans le cours.


                            Les pages 16-17 de ce sujet ne t'aiderait pas un peu ? ^^ 

                            Squirrel Jo a écrit:

                            Quand je lit le code de la fonction send(), je comprends que la page est générée puis que le script est arrêté. Est-ce que je me trompe ?

                            Merci :)

                            c'est ça, la fonction exit affiche la page et sort :)

                            -
                            Edité par Karolyn 21 juillet 2017 à 19:17:58

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 juillet 2017 à 19:30:31

                              Karolyn a écrit:

                              nicorellier10 a écrit:


                              Alors j'ai du mal à comprendre. Je sais pas si ce sont les notions qui ne sont pas encore assez claire ou une erreur ou incompréhension dans le cours.


                              Les pages 16-17 de ce sujet ne t'aiderait pas un peu ? ^^ 

                              Squirrel Jo a écrit:

                              Quand je lit le code de la fonction send(), je comprends que la page est générée puis que le script est arrêté. Est-ce que je me trompe ?

                              Merci :)

                              c'est ça, la fonction exit affiche la page et sort :)

                              -
                              Edité par Karolyn il y a 4 minutes


                              Merci Karolyn pour ta réponse.

                              J'avais cherché ailleurs sur le net mais ici je n'avais pas fait les 16 pages de ce billet pour être honnête. Comme cité, j'ai trouvé un post intéressant qui m'a solutionné à moitié puisque j'ai remplacé ma fonction hydrate en constructeur (sans changer le contenu).
                              Puis le lendemain je suis tombé sur le post de Mokhona en page 18 qui m'a confirmé que la fonction hydrate doit être appelé dans le constructeur.

                              Dommage que ce détail ne soit pas précisé dans le cours. Ca peut sembler évident, surtout que le contraire n'a pas été dit non plus mais quand tu débute en POO et que ces notions sont nouvelles, tu bloque sur cette question.

                              J'avais pas encore mis à jour mon post en me disant que peut être j'aurais un élément de réponse différent ou qui complémentaire.


                              EDIT :
                              En revanche, l'auteur du cours le précise en correction dans le TP qui viens juste après "TP: Mini-jeu de combat" mais ne voulant pas le faire avant d'avoir compris, je l'ai vu qu'après avoir compris.
                              Et j'imagine que je dois pas être le seul à qui c'est arrivé ou à qui ça arrivera

                              -
                              Edité par nicorellier10 21 juillet 2017 à 19:36:02

                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 juillet 2017 à 20:16:45

                                c'est un test pour voir si on suit :p hahaha
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 juillet 2017 à 16:38:16

                                  J'ai finalement fait le choix de tester les dates d'expiration des fichiers de mise en cache en dehors de la classe Cache. Et maintenant que je suis allée au bout de l'activité, je pense que c'est le bon choix. En effet, la date d'expiration étant une donnée écrite dans le fichier, on doit la lire : une méthode de la classe Cache renvoie les deux informations contenues dans le fichier. La date d'expiration est alors traitée par la méthode qui a demandé le fichier de mise en cache.

                                  J'espère que cela pourra t'aider.

                                  Bon courage

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 août 2017 à 7:52:01

                                    Bonjour,

                                    Je suis également le cours et j'ai un soucis d'incompréhension concernant un exemple dans le chapitre "méthodes magiques/« __isset » et « __unset" »". Je ne saisis pas le résultat du premier exemple.

                                    https://openclassrooms.com/courses/programmez-en-oriente-objet-en-php/les-methodes-magiques-3#/id/r-1670163

                                    L'attribut attribut existe !
                                    L'attribut unAutreAttribut n'existe pas !


                                    Je ne comprends pas pourquoi l'appel du second attribut n'a pas le même comportement.

                                    Merci pour votre aide.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 août 2017 à 16:29:06

                                      Z0om, unAutreAttribut n'a pas été créé, mais c'est unAttributPrivé qui a été créé.

                                      -
                                      Edité par jissey 18 août 2017 à 18:10:47

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 août 2017 à 11:09:55

                                        jissey a écrit:

                                        Z0om, unAutreAttribut n'a pas été créé, mais c'est unAttributPrivé qui a été créé.

                                        -
                                        Edité par jissey il y a environ 16 heures


                                        J'avais pas les yeux en face des trous. Merci pour ton aide.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 août 2017 à 14:09:40

                                          J'ai enfin fini !

                                          J'attend la correction de l'activité,

                                          Pas facile mais pas impossible, en tout cas l’activité ma plus, elle permet de vraiment comprendre le fonctionnement de ce mini framework, j'ai pataugé au début puis c'est venu tous seul, le plus dur au finale c'est de réussir a comprendre ce que l'auteur veut qu'on face, il est pas trés clair du tout.

                                          exemples, il parle du cache DES vues tout au long de l’énoncé mais a la fin il nous dit de réaliser seulement LA vue de l'index, du coup je savais plus ! une ou plusieurs ? 

                                          la méthode createCache ben je trouve qui a mieux quand même que faire comme ça ! :/

                                          par contre, j'ai corriger trois exercice = 3 zéros car feuille blanche ce qui veut dire :

                                          -ces personnes ce fiche d'avoir le certificats et donc envoie n'importe quoi pour avoir la correction

                                          -ou elle veulent la correction pour refaire le tp sur un autre compte

                                          -ou elles ce sont tromper

                                          dans les deux premiers cas il y a fort a parier que ces personnes corrigerons a l'arrache car pas intéressé voir mettrons 0 ou (j’espère c'est mieux)10  

                                          mais sans vraiment corriger, en tout cas je suis déçut de pas voir pu corriger de vrais exercices, c'est enrichissant de voir les méthodes de d'autres personnes.

                                          Bon courage a tous !

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            21 août 2017 à 15:02:49

                                            Bonjour,

                                            cela fait plusieurs fois que j'essais de me mettre (enfin) à la POO, et pour être sur de partir sur des bonnes bases, je recommence à coder les fonctions primaires comme énoncé dans le début du cours. J'ai donc coder ma classe Personnage, et ma classe PersonnageManager. J'ai réussi à ajouter, supprimer, récupérer les personnages depuis la base de donnée. Je me heurte à un soucis pour la fonction Update.

                                            En fait, quand je récupère le personnage dans la BDD, je me suis aperçu que mes champ INT étaient retourné sous forme de String. Et je ne comprends pas ! Exemple :

                                            - J'appelle la base de donnée pour récupérer les informations du personnage "Cagalli".

                                            - Je tri le tout dans une variable $donnee avec fetch(PDO::FETCH_ASSOC)

                                            - Je renvois un nouveau personnage construit avec $donnee

                                            Problème ! si je regarde le type de $data['niveau'] il s'agit d'un string. Alors qu'il est bien marqué comme INT dans la BDD. Rien d'insurmontable puisque je pourrais forcer le type, mais c'est surtout le fait de ne pas comprendre. Et j'aimais bien le fait de vérifier avec is_int dans la classe personnage pour être sur qu'on nous envois pas de mauvaises données. Plutôt que forcer la conversion.

                                            Voici mon code :

                                                public function get($nom) { // recuperer le profil d'un personnage
                                                  // on verifie que le personnage existe bel et bien
                                                 $nom = $nom; // On enregistre le nom dans une variable $nom, sinon on obtient une erreur
                                                  $requete = $this->_db->query("SELECT COUNT(*) as nombre FROM `personnages` WHERE nom = '$nom'"); // On compte le nombre d'occurence dans "nombre"
                                                  $resultat = $requete->fetch(); // On relie les résultats dans un tableau
                                            
                                                  if ($resultat['nombre'] == 1) { // Si e personnage existe
                                                    $req = $this->_db->prepare("SELECT * FROM `personnages` WHERE nom = '$nom'");
                                                    $req->execute();
                                                    $data = $req->fetch(PDO::FETCH_ASSOC);
                                                    //$error = $req->errorInfo();
                                                    //print_r($error);
                                                    // print_r($data);
                                            
                                                    if (is_string($data["niveau"])) { 
                                                      $type = gettype($data["niveau"]); echo $type;
                                            
                                                      $niveau = $data['niveau'];
                                                      $type2 = gettype($niveau);
                                                      echo $type2;
                                            
                                                       }
                                                    return new personnage($data);
                                            
                                                  }
                                                }

                                            La base de donnée :

                                            Merci d'avance ...

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              21 août 2017 à 15:45:54

                                              Salut,

                                              Pour cette affaire de type.  C'est un comportement normal par défaut tout est retourné comme une chaîne de caractères.

                                              L4, risque d'injection SQL, tu ne prépares pas (et je crois que tu peux te passer de cette ligne, en travaillant qu'avec une seule requête),  L8 tu utilises mal la requête préparée

                                              -
                                              Edité par WillyKouassi 21 août 2017 à 15:47:18

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              le bienfait n'est jamais perdu
                                                25 août 2017 à 0:37:23

                                                Bonjour, j'ai quelques problèmes pour cerner les concepts présentés en dernière partie de ce cours. Je cite :

                                                " Avant de commencer à créer une application, encore faudrait-il savoir ce que c'est et en quoi cela consiste. En fait, il faut décomposer le déroulement des actions effectuées du début à la fin (le début étant la requête envoyée par le client et la fin étant la réponse renvoyée à ce client). De manière très schématique, voici le déroulement d'une application (voir la figure suivante). "

                                                Etc...

                                                Après avoir lu et relu ce chapitre, je comprends globalement l'idée derrière la conception du site, mais j'ai toujours beaucoup de problème avec des termes qui ne sont pas clairement définis...

                                                Alors, je pose ma question, qu'est ce qu'une application ? est-ce que quelqu'un a une définition claire à proposer ? Qu'est ce que l'auteur du cours entends par application ? Oui une application se déroule selon plusieurs étapes comme ceci, puis comme cela, oui il y a un bootstrap qui s'execute sur le serveur a chaque fois que... Oui, une application est symbolisée par une classe, elle a la capacité de s'executer etc... Mais  qu'est ce qu'une application ?

                                                -
                                                Edité par Chugar 25 août 2017 à 0:39:12

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  25 août 2017 à 11:53:11

                                                  Bonjour,

                                                  Je suis actuellement sur le cours " Concevez votre site web avec php et mysql" dans la partie "lire et écrire dans un fichier".

                                                  Mathieu Nebra nous propose de modifier le CHMOD en passant par le logiciel FTP, en faisant un clique droit sur le fichier on est censé trouvé « CHMOD » ou « Permissions de fichier » or je n'ai ni l'un ni l'autre.

                                                  En faisant des recherches sur le forum openclassrooms je suis tombée sur un problème similaire ou "tartanpion52" répond:

                                                  "Sous windows que ce soit avec ou sans application FTP la notion  de chmod est inexistante. Il faut passer par la gestion de droits windows."

                                                  Pourtant Mathieu dit dans son cours "Sous Windows, vous n'en avez probablement jamais entendu parler, tout simplement parce que ça n'existe pas. Mais le serveur de votre site, lui, est le plus souvent sous Linux. Et sous Linux, on utilise ce qu'on appelle le CHMOD pour gérer les droits."

                                                  Je suis complètement perdue... Comment passer par la gestion de droits Windows cité par "tartanpion52" ?

                                                  Merci d'avance pour votre aide.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    29 août 2017 à 13:23:57

                                                    @GaëlleQuétel : Bonjour!

                                                    Il n'y a certainement pas de contradiction entre les deux assertions. Pas de notion de chmod dans Windows. Par contre Windows fait la gestion de droit (lecture, ecriture) à sa manière, ce qui est en quelque sorte ce que fait le chmod d'un OS GNU/Linux.

                                                    Voudrais-tu concretement nous dire le problème que tu as?

                                                    ps: Si la gestion de droit des fichiers sur Windows te tente toujours voici des liens qui peuvent t'aider:

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      30 août 2017 à 11:20:16

                                                      @Bam92: Bonjour et merci pour ta réponse.

                                                      J'ai paniqué pour rien!

                                                      Je pensais que ne pouvant pas configurer le CHMOD je ne pouvais pas finir ce chapitre...

                                                      En fait je n'avais justement pas besoin de le faire l'exercice à bien fonctionné!

                                                      Merci et bonne journée! 


                                                      -
                                                      Edité par Gaëlle88 30 août 2017 à 11:24:00

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        30 août 2017 à 11:58:28

                                                        Bonjour,

                                                        J'ai un souci sur un site réalisé il y a un moment à partir de ce TP. Il semble allergique aux "&" dans les url. Dès qu'il y en a une, on est systématiquement renvoyé sur la page 404. Il semble pourtant que les routes écrites autorisent théoriquement ce caractère, aussi je me dis que ça vient peut-être de Application.php qui essaye de trouver un module inexistant en utilisant ce caractère pour découper l'url.

                                                        Quelqu'un aurait eu ce problème ? Ou en verrait l'origine ? Merci.

                                                        Edit : trouvé.

                                                        -
                                                        Edité par Roswell 30 août 2017 à 15:10:46

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          30 août 2017 à 17:24:32

                                                          Bonjour Roswell,

                                                          Avec un peu plus d'infos il y aura de monde pour t'aider.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            31 août 2017 à 9:40:27

                                                            Oui merci mais j'ai fini par résoudre mon problème, sans toutefois être certain de son origine. J'avais créé un post à côté https://openclassrooms.com/forum/sujet/regex-remise-en-cause-dans-un-routes-xml : ce qui se passe, c'est que l'appli Buffer sur Chrome rajoute des paramètres à l'url, ce qui fait foirer mes routes. J'ai commencé à changer le regex pour autoriser les caractères rajoutés type _ ou = mais il y avait un problème spécifique avec "&" qui fait passer tout le site en 404. Ne trouvant pas de solution particulière, j'ai commencé à envisager que l'origine du problème soit lié au fonctionnement même du site et son analyse des url. Le site a été réalisé à partir de ce tuto, d'où ma question. Au final, j'ai changé ma regex pour un ".+" et le problème est résolu. Je ne comprends toutefois pas pourquoi maintenant ça marche, et ça m'énerve un peu, mais j'ai trop de chats à fouetter en ce moment pour m'attarder vraiment sur la question.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              4 septembre 2017 à 18:08:37

                                                              hello, j'aimerais comprendre la signification du .htaccess
                                                              RewriteEngine On
                                                              
                                                              #Si le fichier auquel on tente d'accéder existe (si on veut accéder à une image par exemple).
                                                              #alors on ne réécrit pas l'URL.
                                                              RewriteCond %{REQUEST_FILENAME} !-f
                                                              RewriteRule ^(.*)$ bootstrap.php?app=Frontend [QSA,L]


                                                              j'ai compris qu'il permet de faire "apparaitre le site en remplaçant index.php par bootstrap.php, mais le reste, je saisis pas tout.

                                                              Autre problème : le virtual host

                                                              Bon, j'ai déjà fait des tutos avec des virtualHost, et c'est toujours la galère .

                                                              Je suis sous mac, avec Mamp dans Applications/MAMP/conf/apache/httpd.conf, j'ai rajouté les lignes

                                                              #NameVirtualHost *
                                                              Include /Applications/MAMP/conf/apache/virtualhost.conf


                                                              dans Applications/MAMP/conf/apache/virtualhost.conf, j'ai ajouté :

                                                              <VirtualHost *:80>
                                                              	DocumentRoot	"/Users/moi/Sites/TPSite/Web/"
                                                              	ServerName		TPSite
                                                              	<Directory "/Users/moi/Sites/TPSite/Web/">
                                                                     AllowOverride All
                                                                  </Directory>
                                                              </VirtualHost>

                                                              TPSite est le nom du dossier dans lequel est rangé le site entier du TP.

                                                              donc, j'ai un ancien site fait par un tuto dont le virtualhost est fait sur le même model qui marche, mais celui-là, impossible.

                                                              j'ai relancé les serveurs, redémarré le mac, lorsque je tape TPSite dans la barre du navigateur, il m'envoie sur un site de travaux public.o_O

                                                              qu'est-ce que j'ai oublié, y a t-il un autre fichier a créer/éditer autre que httpd.conf ou virtualhost.conf?

                                                              ah oui, j'ai failli oublié je suis bien en port 80 et 3306.

                                                              Merci d'avance.

                                                              -
                                                              Edité par jissey 5 septembre 2017 à 10:43:53

                                                              • 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