Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Programmez en orienté objet en PHP

    20 mai 2015 à 16:39:55

    Bonjour à tous,

    J'étudie ce cours avec attention et n'en suis qu'au début.

    Je cherche à adapter pour une connexion avec postgreSQL ce tutoriel pour des besoins personnels tout en me basant sur ses indications.

    J'ai créée 2 classes l'une qui gère des objets Utilisateurs, l'autre qui est censée permettre de consulter, ajouter, supprimer, modifier les données utilisateurs dans une base de données (comme dans le tutoriel:D).

    Mon script principal est :

    <?php
        include 'inc/utilisateur.inc';
        include 'inc/utilisateurManager.inc';
        $user = new Utilisateur([
            'identifiant' => 'patrick',
            'password' => '010912',
            'nom' => 'Fillol',
            'prenom' => 'Patrick',
            'email' => 'patrick.fillol@monmail.fr'
        ]);
        try
        {
            $bd = new PDO('pgsql:host=localhost;port=5432;dbname=bd_admin;user=postgres;password=010912');
            $bd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // On émet une alerte à chaque fois qu'une requête a échoué.
        }
        catch (Exception $e)
        {
            die('Erreur : ' . $e->getMessage());
        }
        $manager = new UtilisateursManager($bd);
        $manager->add($user);
    ?>

    Le code de la classe Utilisateur :

    <?php
    
    /* 
     *      Classe objet pour les utilisateurs
     */
    
    class Utilisateur {
        // Attributs
        private $_id,
                $_identifiant,
                $_password,
                $_nom,
                $_prenom,
                $_email;
        
        // Méthodes
        public function __construct($donnees) {
            $this->hydrate($donnees);
        }
    
    
        public function hydrate(array $donnees){
            foreach ($donnees as $key => $value){
                $method = 'set'.ucfirst($key);
                // Si le setter correspondant existe.
                if (method_exists($this, $method)){
                  // On appelle le setter.
                  $this->$method($value);
                }
            }
        }
        
        // Accesseurs
        public function id(){return $this->_id;}
        public function identifiant(){return $this->_identifiant;}
        public function password(){return $this->_password;}
        public function nom(){return $this->_nom;}
        public function prenom(){return $this->_prenom;}
        public function email(){return $this->_email;}
        
        // Mutateurs
        public function setId($id){
            $this->_id = $id;
        }
        public function setIdentifiant($identifiant){
            $this->_identifiant = $identifiant;
        }
        public function setPassword($password){
            $this->_password = $password;
        }
        public function setNom($nom){
            $this->_nom = $nom;
        }
        public function setPrenom($prenom){
            $this->_prenom = $prenom;
        }
        public function setEmail($email){
            $this->_email = $email;
        }
    }
    ?>

    Le code de la classe UtilisateursManager :

    <?php
    /* 
     *      Classe objet pour l'Utilisateur Manager
     */
    class UtilisateursManager {
        private $_bd; // Instance de PDO.
    
        public function __construct($bd){
          $this->setDb($bd);
        }
        public function add(Utilisateur $user){     // Ajoute un utilisateur
            $q = $this->_bd->prepare('INSERT INTO app_users SET identifiant_user = :identifiant, password_user = :password, nom_user = :nom, prenom_user = :prenom, email_user = :email');
            $q->bindValue(':identifiant', $user->identifiant());
            $q->bindValue(':password', $user->password());
            $q->bindValue(':nom', $user->nom());
            $q->bindValue(':prenom', $user->prenom());
            $q->bindValue(':email', $user->email());
            $q->execute();
        }
        public function delete(Utilisateur $user){  // Efface un utilisateur
            $this->_bd->exec('DELETE FROM app_users WHERE id = '.$user->id());
        }
        public function get($id){                   // Recherche un utilisateur
            $id = (int) $id;
            $q = $this->_bd->query('SELECT identifiant_user, password_user, nom_user, prenom_user, mail_user FROM app_users WHERE id = '.$id);
            $donnees = $q->fetch(PDO::FETCH_ASSOC);
            return new Utilisateur($donnees);
        }
        public function getList(){                  // Retourne la liste de tous les utilisateurs
            $user = [];
            $q = $this->_bd->query('SELECT identifiant_user, password_user, nom_user, prenom_user, mail_user FROM app_users ORDER BY nom_user');
            while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
            {
                $users[] = new Utilisateur($donnees);
            }
            return $users;
        }
        public function update(Utilisateur $user){  // Met à jour les données d'un utilisateur
            $q = $this->_bd->prepare('UPDATE app_users SET identifiant_user = :identifiant, password_user = :password, nom_user = :nom, prenom_user = :prenom, mail_user = :mail WHERE id_user = :id');
            $q->bindValue(':identifiant', $user->identifiant(), PDO::PARAM_INT);
            $q->bindValue(':password', $user->password(), PDO::PARAM_INT);
            $q->bindValue(':nom', $user->nom(), PDO::PARAM_INT);
            $q->bindValue(':prenom', $user->prenom(), PDO::PARAM_INT);
            $q->bindValue(':mail', $user->mail(), PDO::PARAM_INT);
            $q->bindValue(':id', $user->id(), PDO::PARAM_INT);
            $q->execute();
        }
        public function setDb(PDO $bd){
            $this->_bd = $bd;
        }   
    }
    ?>

    En tout cela je ne vois rien qui change fondamentalement du tutoriel. Pourtant, lorsque j'essaie de créer un enregistrement notamment, j'ai un message d'erreur sur la méthode add(Utilisateur $user) reportée sur $q->execute() et enfin un message d'erreur sur la requête. Donc pas d'insertion dans la base de données.

    Je ne trouve pas le problème.

    Merci pour votre aide.

    Cordialement.


    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2015 à 19:55:00

      Salut, j'ai une petite question pour le TP de la troisième partie, surement un peu bête mais bon...

      Quelle sont les données a mettre en cache au juste ? 

      Les données qu'on veut ? ou juste les news ? ou juste les commentaires ? ou les deux ? 

      J'ai également une deuxième question mais cette fois ci pour la mise en cache des vues !

      Pouvons nous procéder la manière qui nous convient, du moment que cela marche correctement, ou devons nous suivre le schéma présenté dans l'exercice ? 

      -
      Edité par Crazyweedz 29 mai 2015 à 11:41:26

      • Partager sur Facebook
      • Partager sur Twitter
        29 mai 2015 à 11:43:59

        bonjour olivier tu utilise quel version de php ou msql parce que moi même j'avais la même erreur et j'ai changé mes versions et depuis finit les pb
        • Partager sur Facebook
        • Partager sur Twitter
        La justice est la plus pire des injustices.
          29 mai 2015 à 16:34:57

           @Crazyweedz,

          Bonjour d'après  ce que je lis il faut les News et listes de commentaires liés à chaque News, pour la deuxième question mieux vaut suivre le schéma plutôt que d'être penalisé ensuite à la notation.

          Bon courage,

          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é!
            30 mai 2015 à 15:33:25

            bonjour,

            je suis un peut dans le flou concernant le tp de la partie 3 : j'ai pas franchement compris quelles données on doit mettre en cache ni pour quelle utilisation

            et je ne comprends pas non plus l'intérêt de mettre le backend en cache

            -
            Edité par jogan 30 mai 2015 à 15:36:03

            • Partager sur Facebook
            • Partager sur Twitter
              30 mai 2015 à 17:45:03

              @jogan

              Bonjour,

              En ce qui concerne les données à mettre en cache, je l'ai expliqué dans mon post précédent. Ces ressources sont mises en cache pour éviter de saturer le serveur inutilement, les données si rien à changé à leur niveau sont récupérées dans le cache autrement elles sont régénérées à la nouvelle demande. En revanche, il est n'a jamais était dit que le backend devait être mis en cache (peut-être sa page d'accueil).

              Une info: il existe un tutoriel "mettre ses données en cache" qui apporte un bon éclairage sur la question.

              En espérant t'avoir mis sur la voie,

              Cordialement,

              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é!
                30 mai 2015 à 18:50:16

                Philippe2463 a écrit:

                @jogan

                Bonjour,

                En ce qui concerne les données à mettre en cache, je l'ai expliqué dans mon post précédent. Ces ressources sont mises en cache pour éviter de saturer le serveur inutilement, les données si rien à changé à leur niveau sont récupérées dans le cache autrement elles sont régénérées à la nouvelle demande. En revanche, il est n'a jamais était dit que le backend devait être mis en cache (peut-être sa page d'accueil).

                Une info: il existe un tutoriel "mettre ses données en cache" qui apporte un bon éclairage sur la question.

                En espérant t'avoir mis sur la voie,

                Cordialement,

                Philippe


                mea-culpa pour le backend, j'avais pas bien lu. par contre pour les données je ne comprends toujours pas l'intérêt de les serialiser dans un fichier surtout si on y accède que pour régénérer le cache des vues qui ce sera pour le plus souvent à faire au même moment que la régénération du cache de données ??
                • Partager sur Facebook
                • Partager sur Twitter
                  30 mai 2015 à 19:37:25

                  @jogan

                    On accède à ces fichiers caches à chaque fois que l'on a besoin de la liste de news ou de la liste des commentaires liés à une news s'ils ne sont pas périmés ce sont eux qui vont être lus, dé-sérialisés et passés à l'objet qui en à besoin: ça évite de multiplier les requêtes.

                    Imagine si une page est demandée 10 000 fois à chaque seconde(à chaque fois requete SQL qui prend du temps et monopolise dans ce cas ton Backcontroller) et bien cette même page mise dans un fichier avec une durée de péremption d'une heure par exemple, calcule un peut le nombre de requête économisées et le temps gagné!!!

                  Compris

                  -
                  Edité par Philippe2463 30 mai 2015 à 19:39:51

                  • Partager sur Facebook
                  • Partager sur Twitter
                  La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                    31 mai 2015 à 10:16:16

                    sonkengmaldini a écrit:

                    bonjour olivier tu utilise quel version de php ou msql parce que moi même j'avais la même erreur et j'ai changé mes versions et depuis finit les pb


                    Bonjour j'utilise php 5.5.12. Pour la base de donnée, j'utilise postgresql en version 9.4.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 mai 2015 à 14:50:50

                      Bonjour , j ai crée un lien de mon formulaire qui envoie vers une page qui récapitule les données d un formulaire , j ai eu cette erreur

                      Call to a member function fetch() on a non-object

                      voici mon code

                      <html>
                      <body>
                          <h1>Mon compte</h1>
                          <h2>Récapitulatif</h2>
                          <h3>Votre liste de cours :</h3>
                       <table>
                           <?php
                          $recapit = $bdd->recap($_COOKIE['id']) ;
                           while($donnees = $recapit->fetch())  { ?>

                                                  <tr>
                                                      <td><?php echo $donnees['nom_cours'];?></td>
                                                      <td><?php echo $donnees['tarifMensuel'];?> </td>
                                                      </tr>

                                      <?php
                        }
                      $recapit->closeCursor();
                      ?>
                        </table>
                          </tbody>
                          </html>

                      -------------------------------------------

                      et la fonction recap :

                      public function recap($id_adherent){
                          $req= $this->bdd->prepare("SELECT nom_cours,tarifMensuel FROM inscription i,cours c WHERE c.id_cours=i.id_cours and i.id_adherent=:id_adherent" );
                           $req->execute(array(
                              ':id_adherent'=>$id_adherent));

                      return $req->fetchColumn();
                      }

                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 mai 2015 à 15:42:37

                        @Philippe2463

                        ben en fait, pas sur d'avoir compris…

                        j'ai l'impression qu'on ne se comprends pas bien. je sais très bien ce que c'est que la mise en cache d'objets métier. mais dans le cas de cet exercice, je ne sais pas si j'ai mal compris la consigne ou si c'est juste qu'elle est contreproductive et juste donnée à titre d'exemple: 

                        dans l'exerce, on doit mettre en cache nos objets qui vont concrètement nous servir à remplir nos vues que l'on vas mettre aussi en cache, ça nous donne donc comme processus : génération du cache objet puis génération du cache des vues à partir du cache objet puis lecture du cache de la vue pour envoyer au client. ensuite les vues sont transmise au client directement à partir du cache.

                        Mais lorsque le cache de la vue n'est plus valide, dans 99% des cas celui de l'objet non plus puisque c'est parce que les données ont été modifiées que le cache n'est plus valide. Pour le coup c'est franchement pas une optimisation, ce qui fait que je me demande si je ne suis pas passé à coté d'une subtilité sur ce que l'on nous demande.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 mai 2015 à 15:47:17

                          @mahachaouch

                          c'est parce que $bdd->recap() ne renvoie pas un objet

                          • Partager sur Facebook
                          • Partager sur Twitter
                            31 mai 2015 à 15:52:16

                            @olivierfillol

                            bonjour,

                            sans les erreurs en question ça vas être un peu dur de t'aider. envoie-les je jetterais un œil.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 mai 2015 à 16:14:48

                              @Jogan

                              Oui c'est vrai que c'est plutôt ambiguë et je trouve aussi que c'est contre productif de mettre en cache des vues AVEC expiration.

                              Les vues ne sont pas censé être modifier régulièrement avec un temps réduit entre les changement.

                              Si ça ne tenait qu'à moi, je mettrais les vues en cache avec la possibilités de les nettoyer/régénérer manuellement ce qui me semble bien plus logique, surtout que l'on travaille avec des template.

                              Donc non, je ne pense pas que tu sois passé a coté d'une subtilité, ou alors je suis passé a coté aussi, mais il est bel et bien demandé que les vues se généré toute seule a chaque appelle du contrôleur correspondant et que ne soit pas générée si elle sont déjà en cache et encore en cours de validité

                              • Partager sur Facebook
                              • Partager sur Twitter
                                31 mai 2015 à 17:35:28

                                @jogan est ce que ça te met sur la voie?

                                Utilité d'un système de cache

                                Je suis sûr que vous vous demandez si votre site a besoin d'un système de cache. Je ne peux pas vous donner la réponse mais vous aider à la trouver. Dans la majorité des cas, votre code PHP vous sort du code XHTML après de nombreux processus qui peuvent être longs à exécuter (requêtes, parsage, boucles, etc.).

                                Le principe d'un système de cache est de récupérer ce code XHTML et de le mettre de côté dans un fichier (en cache) pour que lors de la prochaine exécution de la page, on affiche directement le code XHTML sans refaire toutes les opérations PHP. Sur un petit site, le gain de temps et de ressources n'est pas très grand mais sur un site dont des pages sont vues des milliers (voire des millions) de fois par jour, ça représente au final une sacrée économie de ressources système.

                                Le Site du Zéro : grand utilisateur du cache

                                Eh oui, un grand site comme celui sur lequel vous vous trouvez en ce moment utilise un système de cache afin de soulager les serveurs en diminuant le nombre de requêtes. De nombreuses choses sont mises en cache, comme par exemple le message aléatoire du Livre d'or dans le menu. Si vous rechargez votre page toutes les secondes, vous verrez qu'il ne change pas à chaque fois, c'est parce qu'il a été mis en cache : il ne change qu'au bout d'une minute, et pendant cette minute, tous les visiteurs verront le même message. Au final, cela ne permet d'économiser qu'une requête, mais avec une fréquence de 185 pages vues par minute, c'est déjà énorme au vu du nombre de pages générées chaque mois (185.60.24.30 = 7992000 requêtes économisées par mois :waw: ).

                                 Extrait du tuto Openclassrooms "comprendre et utiliser un système de cache "

                                -
                                Edité par Philippe2463 31 mai 2015 à 17:37:50

                                • Partager sur Facebook
                                • Partager sur Twitter
                                La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                                  31 mai 2015 à 20:12:11

                                  @jogan 

                                  Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\conservatoire\signin.php on line 144

                                  pourquoi la fonction ne renvoie rien ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    31 mai 2015 à 20:19:58

                                    le principe est le suivant :

                                    apres avoir rempli le formulaire et coché les cours auxquels on veut s inscrire on appuie sur submit, apres un lien s affiche "recap" qui redirige vers la page moncompte ou on voit la liste des cours et leurs tarif s afficher dans un tableau 

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 juin 2015 à 10:15:41

                                      @mahachaouch

                                      Tu essaye d'utiliser "fetch()" sur quelque chose qui n'est pas un objet !

                                      Un While ne s'utilise pas de cette manière !

                                      Utilise un foreach.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        1 juin 2015 à 14:31:31

                                        @Philippe2463

                                        Franchement plus ça va moins je suis sur d'avoir compris la consigne.

                                        la question que je pose c'est pas qu'est-ce qu'un système de cache ou à quoi ça sert mais là la consigne est de martre en cache le rendu des vues sans code php donc un cache par page + chacun des paramètres de sessions utilisés pour rendre les vues et à coté de ce cache là un cache objet pour stocker le contenu que l'on vas utiliser pour générer le cache de la vue. c'est vraiment ça qu'on doit faire ! 

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          1 juin 2015 à 15:46:55

                                          Oui!!!! Ta page est composée d'une vue et d'un contenu( liste de News ou liste commentaires liés à une News).

                                          je t'ai mis l'explication, je croyais que tu doutais de l'intérêt de la mise en cache.

                                          bon courage, je te rassure ou pas mais je patauge  un peu, également, mais c'est enrichissant!

                                          -
                                          Edité par Philippe2463 1 juin 2015 à 15:54:46

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                                            1 juin 2015 à 16:51:23

                                            @Philippe2463

                                            non je ne doute pas de l'intérêt de la mise en cache mais par contre je ne suis pas sur d'avoir compris quel type de cache de vues on veut faire. habituellement quand je mets en place un cache, je le fait en amont du router avec varnish ou squid que je gère avec les entêtes http (cache-control, expires... et ETag) mais  je ne mets jamais tout en cache, seulement des blocs pour pouvoir garder le coté dynamique du site (notamment les traitements liés aux données de sessions) et donc avec des balises ESI (Edge Side Include) et contrairement à ce qui est demandé mes caches de vues sont toujours en php pour pouvoir y inclure les parties dynamiques.

                                            par contre dans l'exercice, si j'ai bien compris, on doit mettre en cache l'intégralité des vues un peu comme si on générait un site statique!?...!!?? j'ai pas compris l'exercice ou c'est vraiment du grand n'import quoi ?

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              1 juin 2015 à 17:19:13

                                              Cela dit c'est un exercice avec un cadre et des consignes afin que ça ne parte pas dans tous les sens. C'est critiquable mais c'est pas forcément une mauvaise façon de faire(pourquoi faire mille fois la même requête si le résultat n'a pas changé depuis 1heure). L'auteur du cours sait très bien ce qu'il nous faire.

                                              bon faudrait peut être que je bosse.

                                              a+

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                                                1 juin 2015 à 18:05:50

                                                bon désolé de faire le relou mais ça me chiffonne ...

                                                si je garde le layout tel quel et que je ne mets en cache que ses parties (en gros le contenu de $content) je suis hors sujet ?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  1 juin 2015 à 20:43:24

                                                  Je ne peut pas te dire! Je n'ai pas assez avancé sur le projet mais il me semble que quand tu veux mettre en cache une vue index elle sera composée du layout et du contenu spécifique de cette vue index. Ensuite c'est l'ensemble en html qui va aller dans ton fichier cache.

                                                  -
                                                  Edité par Philippe2463 1 juin 2015 à 22:56:18

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                                                    2 juin 2015 à 1:05:43

                                                    ben oui je sais c'est ce qui a l'air d'être indiqué mais je pense que ce qu'il a voulut dire c'est "mettre en cache chaque éléments du layout" parque sinon :

                                                    1 on ne peut plus accéder aux données de sessions (on s'en sert pour le menu)

                                                    2 si on propose une connexion aux utilisateurs (pour éviter le spam dans les commentaires par exemple) ça implique un fichier de cache par utilisateur et par page ! (bonjour la saturation du disque et les IOwait sur les grosses montées en charge!).

                                                    Du coup je crois que je vais quand même faire le cache des vues par blocs.

                                                    en tout cas j'espère que tu avance bien. j'ai quasiment fini, je modifie le routage pour utiliser le cache des vues, je fais la fonction pour vider le cache et fini !

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      3 juin 2015 à 23:05:41

                                                      Merci @Jogan et @Philippe2463!

                                                      Çà fait bientôt deux mois que je patauge dans cette mélasse et, même si le sujet reste glauque pour ma petite cervelle, votre discussion me laisse entrevoir une lueur de solution...

                                                      Mais, dans un environnement de dev où l'on est à des années-lumière des 10 000 requêtes par seconde dont parle Philippe2463, c'est pas facile de s'imaginer quel gain peut apporter un cache de vues doublé d'un cache de données...

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        4 juin 2015 à 1:16:51

                                                        @guettoudou

                                                        bah finalement je me suis résigné à faire l'exercice tel quel malgrès l'incohérence de mettre en cache des données peu utilisées (puisque les vues en cache) et de faire la mise en cache des vues complètes sans équivalents ESI. de ce que j'ai pu voir des trois corrections que j'ai fait, ça n'a pas été simple ! pour revenir à ta question, du dev et de la montée en charge, autant la question de l'optimisation est à mon sens une question qui se pose à tous les moments du développement autant les stratégies et meure mise place se fait après analyse des points chaud lors de montée en charge réelle.

                                                        pour conclure, au vu de la correction, je me suis un peu trop pris la tête pour rien.... courage pour le glauque .... ! ;-)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          4 juin 2015 à 13:57:40

                                                          @guetoudou

                                                          l'avantage c'est que tu peux mettre une péremption longue sur les données (ex:1 semaine)et si il y a modif le cache est régénéré tandis que la vue est régénérée plus souvent ( toutes les heures) si on les demande bien sûr. Autant se préparer à la montée en charge et s'éviter un problème de plus à traiter.( le hasard favorise les esprit préparés). Ce n'est que mon point de vue mais à voir petit, on ne fait que de petites choses! P....! Je deviens philosophe! 

                                                          Faut que j'aille me rafraîchir 🏊

                                                          -
                                                          Edité par Philippe2463 4 juin 2015 à 14:15:19

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
                                                            4 juin 2015 à 21:14:57

                                                            Bonjour a tous , 

                                                            Est ce que quelqu'un pourrait m'aider à résoudre mes problèmes avec mon site web svp  .

                                                            Merci d'avance , voici le lien : http://openclassrooms.com/forum/sujet/aide-site-web-php

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              8 juin 2015 à 16:25:34

                                                              Plop,

                                                              Petite question certainement stupide. Je viens de télécharger les sources du cours pour réaliser l'activité. Il faut activer un module quelconque sur WAMP ? Quand je cliques sur un lien les url ne fonctionnent pas comme elles devraient. Enfin elles me font remonter d'un niveau, et me font revenir à la racine.

                                                              Merci d'avance, bisous !

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Si t'as pas d'amis, prends un curly, et si t'as pas de curly vas à Simply (Je sors >> [-] oui ceci est une porte)

                                                              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