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 :

Formulaire de Recherche Multicritères


Sujet :

PHP & Base de données

  1. #1
    Meewix
    Invité(e)
    Par défaut Formulaire de Recherche Multicritères
    Bonsoir à tous les noctures,

    Je souhaite faire une recherche multicritères mais je ne sais pas trop comment gérer ceci sous PHP/MySQL.

    J'ai fait mon formulaire (le plus facile à faire) que voici :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title></title>
    </head>
     
    <body>
    <form name="FormSearch" method="post" action="result.php">
      <p>
        Prix : 
        <select name="prix" id="prix">
          <option value="100000">- de 100 000</option>
          <option value="300000">de 100 000 &agrave; 300 000</option>
          <option value="700000">de 300 000 &agrave; 700 000</option>
        </select>
    </p>
      <p>Surf 1 
        <select name="surf01" id="surf01">
          <option value="50">- 50</option>
          <option value="70">de 50 &agrave; 70</option>
          <option value="100">de 70 &agrave; 100</option>
        </select>
    </p>
      <p>Surf 2 
        <select name="surf02" id="surf02">
          <option value="100">- 100</option>
          <option value="300">de 100 &agrave; 300</option>
          <option value="301">+ 300</option>
            </select>
    </p>
      <table width="200">
        <tr>
          <td>Nb pi&egrave;ces </td>
        </tr>
        <tr>
          <td><label>
            <input type="radio" name="pieces" value="1">
            1</label></td>
        </tr>
        <tr>
          <td><label>
            <input type="radio" name="pieces" value="2">
            2</label></td>
        </tr>
        <tr>
          <td><label>
            <input type="radio" name="pieces" value="4">
            3</label></td>
        </tr>
        <tr>
          <td><label>
            <input type="radio" name="pieces" value="5">
            5</label></td>
        </tr>
        <tr>
          <td><label>
            <input type="radio" name="pieces" value="6+">
            6+</label></td>
        </tr>
      </table>
    </form>
    </body>
    </html>
    Ensuite le fichier PHP pour afficher le résultat, enfin le début car après je ne sais pas mais je veux bien qu'on me guide :
    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
    require("./../pass/config.inc.php");
    require("./../admin/fonction.php");
     
    // connexion à la base
    $db = mysql_connect($HostName, $UserName, $UserPass) or die ('Erreur de connexion '.mysql_error());
     
    // sélection de la base  
    mysql_select_db($MysqlBdd,$db) or die ('Erreur de selection '.mysql_error());
     
    // requête SQL qui récupère tous les enregistrements
    $select = 'SELECT * FROM annonces WHERE publi="oui" ORDER BY date_ins DESC';
    $result = mysql_query($select,$db) or die ('Erreur : '.mysql_error() );
    .
    .
    .
    .
    .
    .
    Merci pour aide

    Meewix

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 106
    Points : 79
    Points
    79
    Par défaut
    Si je comprends bien, tu cherches à sortir de ta bdd les éléments qui correspondent aux données envoyées par ton formulaire ?

    Je suis assez novice, mais moi je chercherais à formuler directement la requête en fonction des infos transmises.

    Genre :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $strSQL = 'SELECT * FROM annonces WHERE publi="oui"';
     
    switch($_POST['prix']) {
    case 100000 : $strSQL.=' && prix<"100000"';break;
    case 300000 : $strSQL.=' && ...';break;
    case 700000 : $strSQL.=' && ...';break;
    default : echo "error";
    }
     
    //idem pour chacun des input de ton form. Pour au final asser la requête.
    requete_SQL($strSQL);

    Voilà, j'espère que je t'ai aidé. Mais peut-être que des personnes plus qualifiées sauront faire mieux
    La connaissance, c'est comme la confiture : moins on en a, plus on l'étale !
    Coluche

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Le principe est bon : compléter la requête avec les différents paramètres. Après, si tu peux éviter les switch, surtout pour de petits nombres de cas, tu gagneras du temps d'exécution.
    Un conseil : fais un echo de ta requête après chaque ajout de paramètre, pour vérifier qu'elle est valide (parenthèses bien refermées, virgules au bon endroit...). Il est facile de se tromper quand on construit une requête avec des conditions.

  4. #4
    Meewix
    Invité(e)
    Par défaut
    Bonsoir,

    Je reviens en force pour en finir avec ceci

    Bon j'ai pas tout compris et si vous pouvez me guider ça serait top, car ça me prend bien le crâne.

    Lorsque tu dis "formuler directement la requête" ça sous entend quoi ?
    De ne pas faire comment j'ai commencé avec mes 2 fichiers, un pour le Form et l'autre qui affiche les résultats ?

    Merci pour votre aide

  5. #5
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    tu veux faire ta recherche dans la base de données en triant sur quels champs ?

    les champs de ton formulaire sont-ils tous obligatoires ou peuvent-ils être absents ? l'utilisateur peut-il n'en avoir rempli aucun ?

    ... ?
    Dia [ Page DVP ] [ Site pro ]

  6. #6
    Meewix
    Invité(e)
    Par défaut
    'soir

    En fait je veux faire une recherche dans ma base de données MySQL sous PHP, une recherche toute simple :

    Les champs sont des SELECT donc obligatoire.

    Recherche un "prix" :
    • -10 000€
    • 10 001 et 20 000
    • 20 001 et 30 000
    • etc.

    couplé au "type" :
    • voiture
    • moto
    • vélo
    • etc.


    et qu'il me sorte les annonces en questions
    Je pense que c'est tout con mais je pige pas comment le faire.

    Voilou

    Merci pour l'aide

  7. #7
    Meewix
    Invité(e)
    Par défaut
    re

    Alors voilà j'arrive bien fonctionner à moitier, je m'explique.
    Si j'indique directement ma valeur ainsi dans mon Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <select name="prix" id="prix">
    <option value="10000">10 000</option>
    et en mettant que ça dans ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = 'SELECT * FROM annonces WHERE prix in ('.$prix.') AND publi="oui"';
    ça marche bien

    MAIS
    je souhaite dire :
    * -10 000€
    * 10 001 et 20 000
    * 20 001 et 30 000
    * etc.

    couplé au "type" :
    * voiture
    * moto
    * vélo
    * etc.

    Et là je n'y arrive pas...

  8. #8
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    si ton intervalle est toujours le même tu peux faire un truc générique, sinon c'est plus compliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE prix > ".($prix - 9999)." AND prix < $prix
    Ensuite t'as juste à ajouter le type avec un ET :

    AND type = $type

    Bye
    Vive les roues en pierre

  9. #9
    Meewix
    Invité(e)
    Par défaut
    Citation Envoyé par Djakisback
    Salut,
    si ton intervalle est toujours le même tu peux faire un truc générique, sinon c'est plus compliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE prix > ".($prix - 9999)." AND prix < $prix
    Ensuite t'as juste à ajouter le type avec un ET :

    AND type = $type

    Bye
    Ton WHERE là, il est dans ma requête mais moi je veux ça dans mon SELECT, je pense qu'il faut un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <option value="prix between 10001 and 20000">10 001 et 20 000 €</option>
    mais ça marche pas !

    Puis pour le "AND type", je l'écrits bien mais il veux pas fonctionner !? je pige pas pourquoi, voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = 'SELECT * FROM annonces WHERE prix in ('.$prix.') AND type in ('.$type.') AND publi="oui"';
    pourtant j'ai bien dans ma base des enregistrements qui peuvent être appelés !?...

    Il me met ça comme erreur : "Erreur : Unknown column 'Terrain' in 'where clause'"

    ("Terrain" c'est le champ "type")

  10. #10
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Ton WHERE là, il est dans ma requête mais moi je veux ça dans mon SELECT
    pas compris ^^

    dans ton form tu mets les valeurs maxi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <option value="10000">- de 10000</option>
    <option value="20000">entre 10 001 et 20 000</option>
    IN c'est plutôt à utiliser si tu veux des choix mutliples, dans ton cas un = suffit :
    Si ton champ prix dans ta base est un int ou un float, tu mets pas de quotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = "SELECT * FROM annonces WHERE prix > ".($prix - 9999)." AND prix < '".$prix."'";
    sinon tu mets des quotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = "SELECT * FROM annonces WHERE prix > '".($prix - 9999)."' AND prix < '".$prix."'";
    [edit]Ton erreur vient du fait que t'as pas mis de quote autour de $type, ce qui va te donner par exemple :

    AND type = Terrain

    Si c'est pas entre quotes, Terrain sera considéré comme un nom de colonne SQL

    [/edit]
    Vive les roues en pierre

  11. #11
    Meewix
    Invité(e)
    Par défaut
    Ok merci

    Bon j'ai mis ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <select name="prix" id="prix">
    <option value="100000">- de 100 000</option>
    <option value="200000">+ 200 000</option>
    <option value="500000">+ 500 000</option>
    <option value="700000">+ 700 000</option>
    <option value="900000">+ 900 000</option>
    </select>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $select = "SELECT * FROM annonces WHERE prix > '".($prix - 9999)."' AND prix < '".$prix."' AND publi='oui' ";
    Mais ça ne fonctionne pas... la recherche ne s'effectue pas en fait, il me balance sur mon ECHO qui me dit "pas d'enregistrement dans la base"

    Idée ?

  12. #12
    Meewix
    Invité(e)
    Par défaut
    J'ai mis " ($prix - 9999) " au lieu de " ($prix - 99999) "
    Mais bon ça règle une partie, là j'ai un décalage de prix...
    je reviens ce soir si je trouve.

  13. #13
    Meewix
    Invité(e)
    Par défaut
    re du matin

    Bon j'ai juste changé < par > pour : prix > '".$prix."'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $select = "SELECT * FROM annonces WHERE prix > '".($prix - 9999)."' AND prix > '".$prix."' AND publi='oui' ";
    Donc ça marche bien SAUF pour le choix " -10 000 € ", logique me direz-vous, donc je bloque jsute là maintenant

    Merci pour votre aide, on touche à la fin :p

  14. #14
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    il ne fallait pas changer, cette requête ne doit pas te retourner ce que tu veux car voici ce que ca donne au final, pour 10000 par exemple :

    SELECT * FROM annonces WHERE prix > '1' AND prix > '10000' AND publi='oui'

    pour 20000 :

    SELECT * FROM annonces WHERE prix > '1' AND prix > '10000' AND publi='oui'

    Comme je te l'ai précisé au-dessus ceci ne marche que si ton intervalle est régulier, et 9999 correspond à l'intevalle voulu, ca ne peut pas marcher pour cette suite de valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <option value="100000">- de 100 000</option>
    <option value="200000">+ 200 000</option>
    <option value="500000">+ 500 000</option>
    <option value="700000">+ 700 000</option>
    <option value="900000">+ 900 000</option>
    Mais en fait tu veux faire quoi finalement, des intervalles ou des "plus de tant" ?
    Je vois que t'as mis des quotes, ton champ prix n'est donc pas un int ou un float dans la base ?
    Vive les roues en pierre

  15. #15
    Meewix
    Invité(e)
    Par défaut
    Citation Envoyé par Djakisback
    Mais en fait tu veux faire quoi finalement, des intervalles ou des "plus de tant" ?
    Je vois que t'as mis des quotes, ton champ prix n'est donc pas un int ou un float dans la base ?
    Ok j'ai remis comme tu m'as donné le la ligne de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = "SELECT * FROM annonces WHERE prix > '".($prix - 99999)."' AND prix < ".$prix." ";
    * d'ailleurs dans la ligne que tu m'avais donné la 2ème instruction contient des quotes donc je le l'ai enlevé.
    Donc en faisant ainsi, il me trouve bien les annonces de -100 000€ mais pas celles de +200 000€, pour celles de +500 000€ il me trouve les annonces de +400 000€, pour les +700 il me trouve les +600, pour les 1 000 000 € il ne trouve rien. Alors que j'ai des annonces tests pour chacune des sélections !
    Donc pb.

    Mon champ "prix" est déclarer en INT, mais honnêtement je sais pas si il faut INT ou autre chose, comme il n'y que des chiffres à enregistrer j'ai mis ceci

    Sinon se que je souhaite c'est bien ça, a savoir afficher les annonces qui sont de -100 000€, les annonces qui sont de plus de 200 000, de +500 000€ etc.
    Donc pas un filtre qui prend de 200 0000 à 499 999€ par exemple, comme ça si on cherche une annonce de +200 000€, il va afficher ceci et aussi les autre s prix suivant. Le +200 000€ est le début d'affichage en fait ensuite les annonces se suivent d'elles memes sans de distinction.

    Voilou merci de prendre le temps en tout cas avec mon cas

  16. #16
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Ok donc tu pourras pas faire un truc générique, il faudra tester le cas du "-10 000", par exemple comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $select = "SELECT * FROM annonces WHERE prix ";
    if($prix == '10000') {
    $select .= "<";
    }
    else {
    $select .= ">";
    }
    $select .= $prix." AND type = '".$type."'";
    Pour ton champ prix, si t'as pas de chiffres à virgules tu peux laisser en INT.
    Oublie pas de protéger tes requêtes : http://www.php.net/manual/fr/functio...ape-string.php

    Fais des echo $select si tu veux mieux te rendre compte de ce que ca donne.
    Tchotcho
    Vive les roues en pierre

  17. #17
    Meewix
    Invité(e)
    Par défaut
    Hum ok je vais voir ça.

    Mais pour en revenir à ta propal de code, ça ne fonctionne pas du tout
    Si je prends le code tel quel, et que je cherche -10K il trouve, si je prends les autres choix il me sort pas les annonces correspondante... donc pb mais je ne vois pas à quel niveau !

    Merci pour ton aide

  18. #18
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    mdr, revisite la premire page t plus dans ltruc la :p
    Vive les roues en pierre

  19. #19
    Meewix
    Invité(e)
    Par défaut
    En effet

    Donc pour des intervalles réguliers ça marche bien MAIS moi je ne veux pas justement ça !
    Je veux pouvoir choisir mes valeurs : -100K OU +200K OU +500K...

    Comment dois je procéder pour que j'avance dans ce sens, tu as (ou vous avez) des exemples ?

    Merci les gars

  20. #20
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Euh finalement si, ca devrait marcher tel quel, fais-des echo $select pour voir ce que donne tes requêtes.
    Vive les roues en pierre

Discussions similaires

  1. [MySQL] Formulaire de recherche multicritères
    Par yanng dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/03/2008, 09h47
  2. Réponses: 3
    Dernier message: 21/09/2006, 11h59
  3. Formulaire de recherche multicritère Access 2003
    Par Mimi64 dans le forum Access
    Réponses: 1
    Dernier message: 19/07/2006, 12h21
  4. Formulaire de recherche multicritères
    Par dolf13 dans le forum Langage
    Réponses: 10
    Dernier message: 20/06/2006, 23h24
  5. Formulaire de recherche multicritères
    Par Michel DELAVAL dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 09h32

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