Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable SELECT dans requete

    22 septembre 2017 à 9:57:10

    Bonjour à tous,

    ça fait deux jours que je planche, impossible de trouver de réponse. j'en appelle à votre aide.

    Je suis actuellement en train de me former sur le php sur un projet perso. Voila mon soucis.

    Je souhaite faire une requête avec une variable dans le SELECT. 

    pour obtenir le résultat avec ce bout de code suivant.

    <?php
    $req_type = $bdd->query('SELECT DISTINCT type_produit FROM catalogue');	
    $types = $req_type->fetchAll();
    ?>			
    <pre>
    <?php
    print_r($types);
    ?>
    </pre>

    ça marche correctemet,il me renvoie mes différentes valeur distinctes. cependant lorsque que je souhaite en faire une requête avec variable comme si-dessous.

    <?php
    //recuperation de chaque valeur d'une colonne
    function get_select($nom_column){
    
    global $bdd;
    
    $nom_column = (string) $nom_column;
    
    
    $req_type = $bdd->prepare('SELECT DISTINCT :colonne AS produits FROM catalogue');
    $req_type->bindParam( ':colonne' , $nom_column, PDO::PARAM_STR);
    $req_type->execute();
    $selection = $req_type->fetchAll();
    return $selection;
    
    }
    
    ?>
    
    <?php
     $select = get_select('type');
    ?>
    
    <pre>
    <?php
    print_r($select);
    ?>
    </pre>
    

    Et ça me renvoi une seule et unique valeur.

    (
        [0] => Array
            (
                [produits] => type
                [0] => type
            )
    
    )

    Savez-vous où j'ai merdé s'il vous plait?. Un enorme merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      22 septembre 2017 à 9:58:44

      Salut,

      tu ne peux pas utiliser les marqueurs et le bind sur les noms de colonnes et de tables, seulement sur les données de condition / modificatin (d'un set)

      De plus "type" est un mot clé réservé SQL, donc à modifier

      ++

      EDIT:

      Pour le SQL 92:

      http://sqlpro.developpez.com/cours/motsreserves/

      Pour MySQL:

      https://fr.wikibooks.org/wiki/MySQL/Mots_r%C3%A9serv%C3%A9s

      -
      Edité par christouphe 22 septembre 2017 à 10:00:50

      • Partager sur Facebook
      • Partager sur Twitter
        22 septembre 2017 à 10:04:53

        Salut,

        merci pour ton éclaircissement. donc pas possible de le faire de cette façon. Il faudrait que je passe par quoi pour réaliser ce genre de requête?

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2017 à 10:06:17

          quel est le but de l'opération ?

          ++

          • Partager sur Facebook
          • Partager sur Twitter
            22 septembre 2017 à 10:17:22

            Mon objectif est d'automatiser la génération de <select><option> ou autre en fonction des différents type de produits qui sont dans la bdd et surtout des futur type de produits qui pourrait y avoir.

            mais aussi faire la même action sur les différentes colonnes de ma bdd. pour cela qu'une fonction avec variable va être plus pratique plutôt que de retaper à chaque endroit où j'en ai besoin une requête.

            Avec un SELECT DISTINCT '.$nom_column.' FROM ça marche.même si ce n'est pas une variable remplie par l'utilisateur ce n'est pas dangeureux?

            -
            Edité par AGcreativ 22 septembre 2017 à 10:29:03

            • Partager sur Facebook
            • Partager sur Twitter
              22 septembre 2017 à 10:46:49

              La concaténation n'est pas dangereuse si tu verrouilles avec une liste blanche:

              <?php
              //recuperation de chaque valeur d'une colonne
                  function get_select($bdd,$nom_colonne) {
                      $aListeChampsAutorises = array();
                      if (!in_array($nom_colonne,$aListeChampsAutorises)) {
                          echo "Erreur: le champ n'est pas reconnu";
                          return;
                      } else {
                          //inutile
                          //$nom_column = (string) $nom_column;
                          $req_type = $bdd->prepare('SELECT DISTINCT '.$nom_colonne.' AS produits FROM catalogue');
                          if (!$req_type->execute()) {
                              echo "Erreur: ecexute";
                              return;
                          } else {
                              return $req_type->fetchAll();
                          }
                      }
                   
                  }

              ++

              • Partager sur Facebook
              • Partager sur Twitter
                22 septembre 2017 à 10:57:01

                Je vois merci beaucoup en tout cas. :)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 septembre 2017 à 11:02:12

                  oublie le global pour la connexion, préfère:

                  • Soit de la passer en paramètres => réutilisation de fonction
                  • Soit de créer la connexion dans le scrip principal => utilisation tout au long du script (includes compris)

                  ++

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Variable SELECT dans requete

                  × 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