Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête préparée

Difficultés avec le code du cours

Sujet résolu
    16 novembre 2017 à 22:59:16

    Bonsoir,

    J'ai fait un copié coller et ça ne fonctionne pas. 

    Voici le code :

    <?php
    	try
    	{
    		$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    	}
    	catch(Exception $e)
    	{
    			die('Erreur : '.$e->getMessage());
    	}
    
    	$req = $bdd->prepare('SELECT nom, prix FROM jeux_video WHERE possesseur = ?  AND prix <= ? ORDER BY prix');
    	$req->execute(array($_GET['possesseur'], $_GET['prix_max']));
    
    	echo '<ul>';
    	while ($donnees = $req->fetch())
    	{
    		echo '<li>' . $donnees['nom'] . ' (' . $donnees['prix'] . ' EUR)</li>';
    	}
    	echo '</ul>';
    
    	$req->closeCursor();
    
    ?>
    
    


    Le message d'erreur est :

    Notice: Undefined index: possesseur in C:\wamp64\www\Mes_projets\Opencalssroom\Transmettre-Donnees\Requetes\test.php on line 12


    Notice: Undefined index: prix_max in C:\wamp64\www\Mes_projets\Opencalssroom\Transmettre-Donnees\Requetes\test.php on line 12



    -
    Edité par SannyDorman 17 novembre 2017 à 14:11:31

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2017 à 5:27:17

      'lut,

      Ben ouais, ta variable super globale $_get qui récupère les valeurs transmises en mode "get" par ta page coté front ne contient pas la cellule nommée "possesseur" ni celle nommée "prix_max" 

      Il va falloir revoir coté front comment sont fournies les valeurs à ce bout de code php

      Pour t'en assurrer dans ton php tu peux ecrire ceci à partir de la ligne 10 :

      if (!isset($_GET['possesseur'])){
        echo "y a pô possesseur";
        exit();
      }
      
      if (!isset($_GET('prix_max'])){
        echo "y a pô prix_max";
        exit();
      }



      • Partager sur Facebook
      • Partager sur Twitter
      J'échange des connaissances. Si je les donnais, je n'en aurais plus
        17 novembre 2017 à 10:03:21

        "J'ai fait un copié coller et ça ne fonctionne pas."

        Et est-ce que tu as compris ce que tu as copié ?

        Non car dire que le cours ne fonctionne pas alors que s'il fonctionne c'est pas terrible

        -
        Edité par quenti77 17 novembre 2017 à 10:05:38

        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2017 à 10:18:27

          Quanti77, faut pas lui jetter la pierre.

          Il est comme tout le monde ici.
          L'accès à la science et à la culture du développement est à la portée de tous.
          Et tous le monde trouve cela bien les tuto, mooc et autre podcast sur des techno en info que ce soit sur le dev ou autre chose
          Sauf qu'avec tout cela la plupart oublie que ce n'est pas un jouet et on ne fait pas mumuse.

          Derièrre il y a un vrai métier une profession, avec des professionnels qui cherche à bouffer.

          Alors ici le message qui faut faire passer c'est de ne pas chercher à s'enteter dans une discipline à la mode mais pour laquelle visiblement on n'est pas fait. Et .... ne pas faire comme tout le monde c'est déjà se démarquer. Ce démarquer c'est se faire remarquer. 

           @+

          -
          Edité par Mon nom est God ; phil God 17 novembre 2017 à 10:19:49

          • Partager sur Facebook
          • Partager sur Twitter
          J'échange des connaissances. Si je les donnais, je n'en aurais plus
            17 novembre 2017 à 13:10:14

            Hola, mais nous sommes partis dans des considérations philosophiques limite de la métaphasique je vois ce matin...

             Moi je ne cherche qu'à avancer chers Monsieurs ou Mesdames.

            Je ne vais pas faire profession du codage PHP, il se trouve que j'ai un projet depuis de nombreuses années et qu'il est plus judicieux pour moi de développer moi-même afin de le faire à mon souhait et d'avoir une parfaite autonomie quand à sa conception.

            Je ne rentre donc pas dans un cadre ou dans un autre, je poursuis un chemin voilà tout.

            Pour répondre à quenti77, oui je comprends le code que je lis mais à chaque nouvelle leçon, quelque chose échappe forcément, car c'est nouveau voilà tout et  tout n'est pas encore intégré. J'y travaille soyez-en certains.

            Donc, si quelqu'un peut me dire pourquoi ce code copier en totalité sur le cours ne fonctionne pas, ce serait bien aimable à lui.

            Sur ce, je vous souhaite une agréable journée, Messieurs Dames,

            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2017 à 13:36:00

              Ok, donc pour expliquer en fait le code du cours est fonctionnel mais dépends d'une chose qui vient de l'extérieur. Il s'agit de la super variable $_GET. Cette variable est généré par rapport à l'url demandé.

              Si j'ai une url : http://localhost/monfichier.php?pseudo=quenti77 alors php va générer le tableau de la variable $_GET avec une clef "pseudo" et une valeur pour cette clef "quenti77".

              Donc si dans le code du cours tu as $_GET['possesseur'] et $_GET['prix_max'] cela veut dire que dans ton url tu dois avoir : http://localhost/monfichier.php?possesseur=quenti77&prix_max=60.

              Le code du cours est donc bon mais il est pas complet et pour le rendre complet il faut faire des test via la fonction isset (ou empty selon les cas). @Mon nom est God ; phil God la indiqué plus haut dans son code.

              Voici le code du cours avec l'ajout de la condition :

              <?php
              
              try {
                  $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
              
                  // Ajout de la gestion d'erreur.
                  // Si tu te trompe dans ta requête ta page plantera au bonne endroit
                  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              } catch (PDOException $e) {
                  // PDOException plutôt que Exception car plus précis
                  echo 'Erreur : '.$e->getMessage();
              
                  // Utilisation de exit() car die() n'est
                  // au final qu'un alias de exit()
                  exit();
              }
              
              $possesseur = null;
              if (isset($_GET['possesseur'])) {
                  $possesseur = $_GET['possesseur'];
              }
              
              $prix = null;
              if (isset($_GET['prix'])) {
                  $prix = $_GET['prix'];
              }
              
              // Tu peux mettre sur plusieurs ligne ta requête SQL
              $reqSelect = $bdd->prepare('SELECT nom, prix FROM jeux_video
                  WHERE possesseur = :poss AND prix <= :prix ORDER BY prix');
              // J'ai mis aussi des marqueurs nominatif car je trouve sa plus lisible
              
              // Nouvelle syntaxe des tableaux depuis php 5.4 (il y a 4 ans ^^)
              // array() devient []
              $reqSelect->execute([
                  ':poss' => $possesseur,
                  ':prix' => $prix
              ]);
              
              // C'est mis comme ça dans le cours donc je le garde mais j'évite
              // de faire des echo du html quand je peux
              echo '<ul>';
              while ($jeu = $reqSelect->fetch()) {
                  echo '<li>' . $jeu['nom'] . ' (' . $jeu['prix'] . ' EUR)</li>';
              }
              echo '</ul>';
              
              $req->closeCursor();
              // pas besoin du ? > de fin si tu n'a pas de code html après

              Voilà avec des commentaires pour mieux comprendres certains points.

              Dsl d'avoir été aussi dur mais j'ai tellement eu de personne qui copie collait les codes sans vouloir comprendre que ça devient vite énervant.

              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2017 à 13:52:10

                Quenti77, je te remercie de cette longue explication que je vais prendre le temps de lire et de décomposer car elle le mérite bien, il se trouve qu'entre temps j'ai trouvé la solution, je ne l'ai aps trovuée toute seule mais elle était simple puisqu'il était question d'intervenir dans l'URL en injectant les données manquantes. 

                J'ai donc introduit possesseur=Patrick&prix_max=15 et ça a fonctionné !!!

                A présent je vais lire ta réponse.

                Et je reviens pour commenter

                EDIT 

                Je vois que tu m'avais donné la réponse. Donc je m'en serai sortie aussi avec toi merci.

                EDIT

                Je pense avoir compris mais je dois décortiquer le cours plus en profondeur et ton code aussi.

                En fait, pour tenter de le comprendre, j'ai essayer de le faire fonctionner et à priori tout est ok sauf que cette fois-ci  il bloque à la ligne 48 : $req->closeCursor();

                Bon, ça va là c'était simple : $reqSelect->closeCursor();

                Il va vraiment falloir que j'approfondisse car ça reste encore un peu du charabia pour moi.

                En tous cas un grand merci aussi pour cette explication fouillée.

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

                EDIT

                Alors là, super !!! J'ai essayer de modier l'URL de ce post 

                https://openclassrooms.com/forum/sujet/requete-preparee-16

                donc à la place de 16, j'ai mis d'autres numéros, en dessous de 16 et ça fonctionne, je tombe sur d'autres discutions sur le même sujet !

                QUel kif !!!!

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

                J'ai fait l'expérience d'introduire les données dans un lien d'une page  index.php comme dans le model Bonjour et c'est bon, tout fonctionne !

                -
                Edité par SannyDorman 17 novembre 2017 à 15:31:18

                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2017 à 6:21:59

                  Sujet clos alors ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  J'échange des connaissances. Si je les donnais, je n'en aurais plus
                    18 novembre 2017 à 12:10:59

                    Oui, j'ai déjà cliqué sur "Résolu"
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Requête préparée

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown