IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Multiselect à partir d'une requête [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut Multiselect à partir d'une requête
    Bonjour,
    J'ai un formulaire avec plusieurs listes dont une est à choix multiple et je récupère dans une autre page (mais c'est pareil lorsque j'envoie le formulaire sur la même page) les lignes de la BDD correspondantes aux valeurs choisies.

    Malheureusement, je n'obtiens jamais plus que les lignes qui correspondent à la dernière valeur sélectionnée mais jamais les autres correspondant aux autres sélections.
    Je peux m'escrimer autant que je peux, que ce soit à partir de la liste ou de son équivalent en cases à cocher, en GET ou en POST,c'est la même chose, impossible d'obtenir toutes les valeurs. Les valeurs du champ choisi sont de type VARCHAR mais c'est pareil avec des décimales, en revanche, je n'ai pas essayé avec un champ ENUM, mais je crains que ce ne soit la même chose.
    Tout ceci dans le cadre d'une recherche avancée qui n'avance guère...
    J'ai consulté beaucoup et obtenu peu jusqu'alors, on me parle de crochets [] à la suite de la déclaration du select name"truc[]" mais ça ne change rien.
    Je ne peux pas faire intervenir BETWEEN parce que c'est du VARCHAR, je suis donc légèrement bloqué.
    Quelqu'un a-t-il une idée ?
    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Pas tres bien compris le soucis, ni le besoin non plus...

    c'est un truc comme ca que tu veux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT mescolonnes...
    FROM matable
    WHERE colatester IN ('val1','val2','val3',...,'valn');
    ---
    Farid

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Non, ce n'est pas du tout ça.
    Le besoin est de remplir un tableau construit à partir des choix utilisateurs dans le cadre d'une recherche détaillée destinée aux agriculteurs et afin d'affiner un choix parmi 400 produits différents qui leur sont destinés.

    Dans un formulaire, je choisi d'abord un type de sol (menu à choix simple):
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <select name="sol" id="sol">
          <option value="%">Indifférent</option>
          <option value="Tout sol">Tout sol</option>
          <option value="Sol frais et humifère">Sol frais et humif&egrave;re</option>
          <option value="Tout sol drainant">Tout sol drainant</option>
      </select>
    Ensuite le type d'exposition (menu à choix simple) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <select name="expo" id="expo">
          <option value="%">Indifférent</option>
          <option value="Plein soleil">Plein soleil</option>
          <option value="Soleil, mi-ombre">Soleil, mi-ombre</option>
      </select>
    Pour finir la hauteur (menu à choix multiple) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <select name="hauteur" size="3" multiple="multiple" id="hauteur">
        <option value="%">Indifférent</option>
        <option value="0,50 cm">0,50 cm</option>
        <option value="0,75 cm">0.75 cm</option>
        <option value="1 m">1 m</option>
        <option value="1,25 m">1,25 m</option>
        <option value="1,50 m">1,50 m</option>
      </select>
    J'ai d'autres critères plus précis encore mais ce n'est pas la question.

    C'est la fin du form, il est envoyé en POST à la page résultat dans laquelle se trouve la requête avec la récupération de toutes les variables POST.
    J'obtiens donc les solutions de produits(tirés de la BDD) et respectant les choix demandés, leur nombre est variable. MAIS lorsque je spécifie 2 ou 3 hauteurs à la fois comme critère de hauteur, je ne les obtiens jamais toutes mais apparaissent alors toutes les lignes correspondantes seulement à la dernière (la plus haute) valeur demandée.
    J'ai essayé de changer le menu hauteur en checkbox, le comportement est le même.
    J'ai essayé à partir de valeurs décimales au lieu de VARCHAR, c'est pareil.
    Voilà, j'espère que c'est clair. Merci

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Il te faut rendre $_POST['hauteur'] tabulaire.
    Pour cela, il faut effectivement nommer la liste name="hauteur[]".
    Alors tu pourras utiliser la syntaxe WHERE `hauteur` IN (liste des valeurs provenant de $_POST['hauteur[]') que t'a fournie Farid_92.
    J'ai supposé que tu traitais ton formulaire avec php.
    Si tu as un doute sur la façon d'utiliser $_POST['hauteur[]'), fais un print_r($_POST) dans ton script et tu comprendras mieux comment c'est organisé par http.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Merci Maljuna Kris
    Bon, les crochets placés sur name="hauteur[]" obtiennent un tableau vide.
    Je livre ici ma requête de récupération des données du formulaire, affichées dans un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    $colsol_recup = "%";
    if (isset($_POST['sol'])) {
      $colsol_recup = (get_magic_quotes_gpc()) ? $_POST['sol'] : addslashes($_POST['sol']);
    }
    $colhauteur_recup = "%";
    if (isset($_POST['hauteur'])) {
      $colhauteur_recup = (get_magic_quotes_gpc()) ? $_POST['hauteur'] : addslashes($_POST['hauteur']);
    }
    $colexpo_recup = "%";
    if (isset($_POST['expo'])) {
      $colexpo_recup = (get_magic_quotes_gpc()) ? $_POST['expo'] : addslashes($_POST['expo']);
    }
    mysql_select_db($database_essai, $essai);
    $query_recup = sprintf("SELECT * FROM vegetaux WHERE vegetaux.expo LIKE '%s' and vegetaux.sol LIKE '%s' and vegetaux.hauteur LIKE '%s' ", $colexpo_recup,$colsol_recup,$colhauteur_recup);
    $recup = mysql_query($query_recup, $essai) or die(mysql_error());
    $row_recup = mysql_fetch_assoc($recup);
    $totalRows_recup = mysql_num_rows($recup);
    ?>
    print_r ($_POST); donne ceci :Array ( [expo] => % [sol] => % [hauteur] => Array ( [0] => 2 m [1] => 4 m ) [Submit] => Envoyer )
    lorsque j'ai sélectionné 2 hauteurs.
    Je ne vois plus.

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par zorbo Voir le message
    Bon, les crochets placés sur name="hauteur[]" obtiennent un tableau vide.
    La preuve du contraire
    Citation Envoyé par zorbo Voir le message
    print_r ($_POST); donne ceci :Array ( [expo] => % [sol] => % [hauteur] => Array ( [0] => 2 m [1] => 4 m ) [Submit] => Envoyer )
    tu peux donc construire la liste pour le IN de la requête SQL, par exemple comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste= '\''.explode('\',\'',$_POST['hauteur']).'\'';
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    ça me renvoie 'Array', je prends l'eau

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Au temps pour moi, remplace explode par implode, ça devrait aller nettement mieux.
    Désolé.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Ma requête de fin est simple;
    SELECT * FROM matable WHERE matable.hauteur LIKE colhauteur (variable correspondante à $_POST['hauteur'], provenant du formulaire).
    Je peux mettre = à la place de LIKE ou IN avec des parenthèses, cela produit les mêmes effets.
    Cette requete affiche ses résultats sous forme d'un tableau
    Cette fonction IMPLODE me renvoie la plus petite valeur choisie dans le menu 'Hauteur[]' mais que puis-je en faire, car je me fiche des valeurs choisies puisque c'est moi qui les choisis mais ce que je souhaite c'est afficher toutes les lignes de la table correspondantes à ces valeurs.
    Je ne suis pas certain de m'être bien fait comprendre et ce dès le début, surtout lorsque l'on me dit "...pas bien compris le besoin non plus...
    Le besoin, c'est mon affaire et il est avéré.
    Je nage toujours dans des eaux toujours plus profondes et mystérieuses.

  10. #10
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par zorbo Voir le message
    Cette fonction IMPLODE me renvoie la plus petite valeur choisie dans le menu 'Hauteur[]'
    Que nenni, elle doit te renvoyer toutes les options saisies entre quotes et séparées par des virgules.
    Citation Envoyé par zorbo Voir le message
    je me fiche des valeurs choisies puisque c'est moi qui les choisis mais ce que je souhaite c'est afficher toutes les lignes de la table correspondant à ces valeurs
    Pour le coup c'est moi qui ne comprends plus.
    Si tu te fiches des valeurs saisies, pourquoi les faire saisir ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $liste= '\''.implode('\',\'',$_POST['hauteur']).'\'';
    echo $liste[0]; ?>
    dans la page résultat, j'ai la valeur choisie dans le formulaire, précédée d'une quote. Lorsque j'en choisi 2 puisque c'est le but, cet echo me renvoie seule la première toujours précédée d'une quote.
    Mais encore une fois, ces valeurs ne présentent pas d'intérêts car je veux obtenir les lignes de la tables correspondantes à ces valeurs.
    Quand je choisis 2 m , la requête me trouve toutes les lignes possédant cet attribut 2 m, et lorsque je choisis dans mon menu 2 m et 3 m dans cette liste multiple du formulaire, j'aimerais que cette requête me trouve toutes les lignes possédant l'un ou l'autre de ces attributs.

  12. #12
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste= '\''.implode('\',\'',$_POST['hauteur']).'\'';
    $liste n'est pas une tableau, c'est une chaine de caractères.
    Donc tu dois faire WHERE....AND vegetaux.hauteur IN ($liste)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Je viens de déplacer la fonction $liste avec implode avant l'exécution de la requête... et ça fonctionne très bien... sauf lorsque je je spécifie "Indifférente" pour la hauteur (valeur %)

  14. #14
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Forcément, '%' est un caractère joker pour LIKE.
    Tu vas donc devoir tester $liste avant de construire le texte de la requête.
    Si $liste contient '%' in ne faut pas intégrer de filtre pour la hauteur dans la clause WHERE.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Bonjour,
    Si je comprends bien la manœuvre, je dois faire un " if % existe, exécuter une requête sans restriction de hauteur, then je ne change rien".
    J'ai beaucoup essayé de tester l'existence ou pas de '%' mais comme c'est un caractère joker, j'ai bien du mal à le faire reconnaitre même si je sais qu'il est quelque part dans l'array.
    En gros, je ne sais pas tester son existence.
    Dans le menu hauteur du formulaire, j'ai construit, afin de le substituer,une requête affichant toutes les lignes, sans distinction de hauteur, mais ça n'est pas mieux.

  16. #16
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Une solution qui ne change rien à ta construction de requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    if(strpos($liste,'%')!==false) $liste="'2m','3m','4m','...'";//et là tu mets tous les items
    ?>
    par contre ça pénalise les requêtes sans spécification de hauteur car la clause IN y est tout de même testée, pour rien.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  17. #17
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Bon, le formulaire fonctionne à présent parfaitement bien, sous réserve de forcer la hauteur à la valeur '%' pour toutes les requêtes, sauf bien entendu celles pour lesquelles on fait varier la hauteur.
    On obtient dans le cas contraire un Warning pour la fonction 'Implode' et donc un tableau vide.
    J'ai opté dans ce cas précis pour des checkboxes qui sont plus adaptées et plus souples pour l'utilisateur moyen, tout y est affiché. J'ai donc sélectionné par défaut la case 'Indifférente' pour la valeur '%'. C'est donc plutôt transparent et il suffit de l'expliquer.
    J'aurais souhaité, c'eût été la cerise sur le gâteau, pouvoir maintenir les choix dans les menus (et checkboxes) après éxecution et l'affichage du tableau.
    Mais peut-être ces variables doivent-elles être obligatoirement remise à 0. C'est possible.
    Je teste ce soir et met en ligne la version finale as soon as possible.
    En tout cas, merci infiniment Maljuna Kris pour ta patience et ta compétence, j'ai fait grâce à toi, un petit pas dans les méandres du PHP, un grand pas pour la pertinence de la page en question et une énorme économie de paracétamol. Merci encore.

  18. #18
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par zorbo Voir le message
    J'aurais souhaité, c'eût été la cerise sur le gâteau, pouvoir maintenir les choix dans les menus (et checkboxes) après éxecution et l'affichage du tableau.
    Mais peut-être ces variables doivent-elles être obligatoirement remise à 0.
    C'est toi qui décides, en fonction de l'existence de valeurs dans $_POST d'intialiser les checkbox ou les options.
    Il n'y a pas d'obligation de remise à zéro, j'en veux pour preuve qu'un bouton de type reset, ne remet pas les champs de formulaire à zéro comme certains le pensent généralement à tort, mais leur réaffecte la valeur au moment du chargement du formulaire par le navigateur (lesquelles sont fréquemment nulles ou vides, d'où la confusion).
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  19. #19
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Au passage, prends connaissance de ce post, notamment la réponse apportée par Cinéphil.
    http://www.developpez.net/forums/d67...l-requete-sql/
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  20. #20
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Je viens de biaiser pour mon pb de Warning affiché à l'entrée de la page. J'ai donc copié une page à l'identique (ou presque, puisque sans la fonction 'Implode') qui soumet le formulaire à une autre page incluant cette fonction.
    Cela revient à faire un binôme recherche/résultat mais c'est plus propre puisque l'erreur ne peut plus survenir pendant la navigation.
    Quant à la conservation des valeurs choisies, je cherche.
    La fonction in_array avec isset ne fonctionne qu'avec les listes à multiselection, or je n'en ai qu'une et je n'en veux pas plus, je souhaite ainsi ne pas rendre cette recherche plus complexe et plus lente.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/09/2011, 18h14
  2. Copier à partir d'une requète
    Par Sendo dans le forum Access
    Réponses: 3
    Dernier message: 28/09/2005, 20h13
  3. Réponses: 4
    Dernier message: 16/09/2005, 14h49
  4. Récupérer le code SQL à partir d'une requête
    Par Edith_T dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 23/11/2004, 14h10
  5. Réponses: 2
    Dernier message: 02/11/2004, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo