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 :

Résultats en fonction de critères [Débutant(e)]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Par défaut Résultats en fonction de critères
    Bonjour, je suis nouveau sur le forum et espère poster au bon endroit.

    Je réalise actuellement un site permettant aux candidats locataires de trouver un logement. Pour ce faire, le visiteur du site doit sélectionner ses critères dont voici un aperçu :




    J'ai donc réalisé un petit script en php me permettant de chercher dans la base de données les logements pouvant répondre aux critères des utilisateurs. Or mon script ne fonctionne pas. Ce que j'ai réussi à faire par contre c'est afficher les résultats en sélectionnant uniquement le loyer mensuel. Mais je n'arrive pas à trouver de solution pouvant répondre à tous les critères. Voici le script permettant de trouver des logements uniquement avec le critère Loyer :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <form method="post" action="location.php">
    				<fieldset>
    				<legend><b>Recherche</b></legend>
    				<table>
    				<tr><td><label for="type"><strong>Type</strong></label> :</td> <td>
    						<input type="checkbox" name="chambre_de_service" id="chambre_de_service" /> <label for="chambre_de_service">Chambre de service</label><br />
    						<input type="checkbox" name="chambre_dans_appartement" id="chambre_dans_appartement" /> <label for="chambre_dans_appartement">Chambre dans appartement (*)</label><br />
    						<input type="checkbox" name="studio" id="studio" /> <label for="studio">Studio</label><br />
    						<input type="checkbox" name="f1" id="f1" /> <label for="f1">F1</label>
    						<input type="checkbox" name="f2" id="f2" /> <label for="f2">F2</label>
    						<input type="checkbox" name="f3" id="f3" /> <label for="f3">F3</label>
    						<input type="checkbox" name="f4" id="f4" /> <label for="f4">F4</label>
    						<input type="checkbox" name="f5" id="f5" /> <label for="f5">F5 et +</label>
    					</td></tr>
    					<tr><td></td></tr>
    					<tr><td></td></tr>
    					<tr><td></td></tr>
    				<tr><td><label for="tranche"><strong>Loyer mensuel</strong></label> :</td> <td><select name="tranche">
    						<option value="moins_de_400">Moins de 400€</option>
    						<option value="de_401_a_550">De 401 à 550€</option>
    						<option value="de_551_a_700">De 551 à 700€</option>
    						<option value="de_701_a_850">De 701€ à 850€</option>
    						<option value="de_851_a_1000">De 851€ à 1000€</option>
    						<option value="de_1001_a_1300">De 1001€ à 1300€</option>
    						<option value="de_1301_a_1600">De 1301€ à 1600€</option>
    						<option value="plus_de_1600">Plus de 1600€</option>
    				</select></td></tr>
    					
    					<tr><td></td></tr>
    					<tr><td></td></tr>
    					<tr><td></td></tr>
    					
    					<tr><td><label for="departement"><strong>Département</strong></label> :</td> <td>
    							<input type="checkbox" name="paris" id="paris" /> <label for="paris">Paris (75)</label><br />
    							<input type="checkbox" name="hauts_de_seine" id="hauts_de_seine" /> <label for="hauts_de_seine">Hauts-de-Seine (92)</label><br />
    							<input type="checkbox" name="seine_saint_denis" id="seine_saint_denis" /> <label for="seine_saint_denis">Seine-Saint-Denis (93)</label><br />
    							<input type="checkbox" name="val_de_marne" id="val_de_marne" /> <label for="val_de_marne">Val-de-Marne (94)</label></td>
    							<td><input type="checkbox" name="seine_et_marne" id="seine_et_marne" /> <label for="seine_et_marne">Seine et Marne (77)</label><br />
    							<input type="checkbox" name="yvelines" id="yvelines" /> <label for="yvelines">Yvelines (78)</label><br />
    							<input type="checkbox" name="essonne" id="essonne" /> <label for="essonne">Essonne (91)</label><br />
    							<input type="checkbox" name="val_oise" id="val_oise" /> <label for="val_oise">Val d'Oise (95)</label><br />
    					</td></tr>
    
    						
    				</table>
    				</fieldset>
    				
    				<p align="right">
    					<input type="submit" value="Rechercher"/>
    				</p>
    				
    			</form>
    			
    					<?php
    			mysql_connect("localhost", "root", ""); 
    			mysql_select_db("base"); 
    	
    			$reponse = mysql_query("SELECT * FROM location 	where tranche='".$_POST['tranche']."'") or die(mysql_error()); 
    			
    			while ($donnees = mysql_fetch_array($reponse) )
    			{
    			?>
    					<p>
    						<strong>
    						<p>Liste des résultats</p><br/>
    							<a href="resultat_location.php?id=<?php echo $donnees['id']; ?>">
    							<?php echo $donnees['id']; ?>
    							</a>
    						</strong>
    					</p>		
    	
    		
    		<?php
    		}
    
    		mysql_close();
    		?>
    J'ai rajouté à cette requête SQL juste après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where tranche='".$_POST['tranche']."'
    le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and departement='".$_POST['departement']."' and type='".$_POST['type']."'"
    Mais ça ne fonctionne pas, pourriez-vous m'expliquer mon erreur. Merci d'avance

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Bonjour

    Je parierais volontiers qu'il te manque un espace entre where tranche='".$_POST['tranche']." et and departement
    Un bon truc pour débuguer ce genre de problème consiste à faire afficher la requête en même temps que l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "SELECT * FROM location 	where tranche='".$_POST['tranche']."'"; 
    $reponse = mysql_query($sql) or die('Erreur sur '.$sql.'<br/>'.mysql_error());
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    et en quoi cela ne fonctionne pas? message d'erreur? résultat de la requête incorrecte? autre?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Par défaut
    Citation Envoyé par Celira Voir le message
    Bonjour

    Je parierais volontiers qu'il te manque un espace entre where tranche='".$_POST['tranche']." et and departement
    Un bon truc pour débuguer ce genre de problème consiste à faire afficher la requête en même temps que l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "SELECT * FROM location 	where tranche='".$_POST['tranche']."'"; 
    $reponse = mysql_query($sql) or die('Erreur sur '.$sql.'<br/>'.mysql_error());
    J'ai vérifié, rien n'est collé, j'ai testé ce que tu m'as donné ca m'affiche donc exactement le même résultat que ce que j'ai fait précédemment. Merci quand même !

    Citation Envoyé par Cybher Voir le message
    salut,

    et en quoi cela ne fonctionne pas? message d'erreur? résultat de la requête incorrecte? autre?
    Il n'y a aucun message d'erreur, par contre lorsque que j'insère mes critères et que je clique sur rechercher, ça me recharge la page et ne me donne aucun résultat pourtant j'ai fais en sorte de choisir les critères répondant à des logements situés dans la base de données pour avoir au moins 1 résultat. Mais vu que je suis débutant en la matière, je me demande déjà si c'est la bonne méthode ...

  5. #5
    Membre émérite Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Par défaut
    Hello,

    Ton probleme est plus compliqué que cela. A mon humble avis tu poses mal le probleme et a l'arrivée, la réponse est a coté...

    Conseils de debug :

    Quand tu veux afficher une variable et arréter ton script, tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $mavariable;
    exit;
    Quand tu veux afficher un tableau et arréter ton script tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print_f($montableau);
    exit;
    1°) Le type de bien

    Tes cases à cocher ont toutes un nom différent. Si tu ecris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $_POST['type'];
    Tu n'auras rien car il n'existe aucune variable du nom de 'type' dans ton formulaire. Voici ce que tu dois écrire (pour avoir des cases a cocher multiple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <input name="type[]" value="f1" id="f1" type="checkbox">F1
    <input name="type[]" value="f1" id="f2" type="checkbox">F2
    <input name="type[]" value="f1" id="f3" type="checkbox">F3
    <input name="type[]" value="f1" id="f4" type="checkbox">F4
    Toutefois, j'attire ton attention sur le fait qu'avec $_POST['type'] tu va récupérer un tableau (array) et non pas une variable...

    2°) Les tranches

    Si a l'éxécution de ton script tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $_POST['tranche'];
    exit;
    Tu va récupérer quelque chose comme :
    de_401_a_550

    Encore une fois ce n'est pas la bonne façon de faire car dans ta base de données cela m'ettonnerait que c'est ce que tu as mis dans la case tranche (mais je me trompe peut-etre).
    Toujours à mon humble avis tu aurais du faire quelque chose de ce style dans le formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <option value="401_550">De 401 à 550€</option>
    <option value="551_700">De 551 à 700€</option>
    <option value="701_850">De 701€ à 850€</option>
    <option value="851_1000">De 851€ à 1000€</option>
    Ensuite tu récupères la variable "tranche" pour l'exploiter (car dedans tu a un minimum et un maximum). Cela donnerais quelquechose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list($min, $max) = split('_', $_POST['tranche']);
    Je suppose que tu dois stocker le prix exact dans ta base, et je vais supposer que la colonne s'appelle "Price". Avec mon $min et mon $max, je vais pouvoir faire une comparaison de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $SQL .= "AND price < ".$max." AND price > ".$min;
    3°) Département

    C'est la même chose que pour le 1°. Donc je te laisse les explications et je vais aller au fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <input name="departement[]" value="75" id="dpt75" type="checkbox">75
    <input name="departement[]" value="78" id="dpt78" type="checkbox">78
    <input name="departement[]" value="92" id="dpt92" type="checkbox">92
    <input name="departement[]" value="93" id="dpt93" type="checkbox">93
    4°) La requete

    Voici ce que je ferais à ta place....
    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
     
     
    $WHERES = "";
     
    // Si j'ai une tranche
    if ($_POST['tranche']) {
    //on coupe la variable en deux
    list($min, $max) = split('_', $_POST['tranche']);
    //on rempli $WHERES
    $WHERES .= "price < ".$max." AND price > ".$min;
    }
     
    //Si j'ai un ou plusieurs type de biens
    if ($_POST['type']) {
    //On initialise sqltype
    $sqltype="";
     
        //Pour tous les types de biens recus
        foreach ($_POST['type'] as $type) {
           if ($sqltype) {$sqltype .= ' OR ';} 
           $sqltype .= 'type = '.$type;
        }
     
        //Si il y a quelque chose dans $WHERES je met un AND pour séparer la condition
        if ($WHERES) {$WHERES .= ' AND ';}
        $WHERES .= '('.$sqltype.')';  
     
    }
     
    //Si j'ai un ou plusieurs département
    if ($_POST['departement']) {
    //initialisation
    $sqldpt="";
     
        foreach ($_POST['departement'] as $dpt) {
           //si sqldpt n'est pas vide
           if ($sqldpt) {$sqldpt .= ' OR ';} 
           $sqldpt .= 'departement = '.$dpt;
        }
     
        if ($WHERES) {$WHERES .= ' AND ';}
        $WHERES .= '('.$sqldpt.')';  
    }
     
    //si j'ai des conditions
    if ($WHERES) {$WHERE = 'WHERE '.$WHERES;}
     
    //Ma requete
    $sql = "SELECT * FROM location ".$WHERE; 
    $reponse = mysql_query($sql) or die('Erreur sur '.$sql.'<br/>'.mysql_error());
    }
    Voila, donc si tu as compris la plupart de ce que j'ai écris, je te dis bravo.
    Maintenant tu as au moins deux bonnes heures de boulot devant toi :-)
    J'espere ne pas avoir fais trop de coquille dans le code...


    @+
    cadou

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Par défaut
    Waouu ! La plupart des choses écrites dans les codes je ne les ai jamais vu ! Mais bon merci beaucoup pour ta réponse, je vais passer toute mon après midi de toute façon à essayer de comprendre point par point jusqu'à que je réussisse.

    Par ailleurs, il y a certains points aux quels je n'avais pas pensé comme le prix et la comparaison automatique avec la tranche, parce que dans ma base de données j'avais mis un champ prix dans le quel je mettais mon prix et un autre champs tranche avec les tranches comme sur la page php et je rajoutai manuellement le nom de la tranche, ce qui est pas top top ...

    Enfin en tout cas merci, je vais donc reprendre point par point jusqu'à ce que j'ai tout compris !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Par défaut
    Bon même si je n'ai pas tout à fait compris le dernier code, j'ai testé pour voir ce que ça allait donner après avoir effectué les premières modifications.

    A la fin de ton dernier code, tu as écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Ma requete
    $sql = "SELECT * FROM location ".$WHERE; 
    $reponse = mysql_query($sql) or die('Erreur sur '.$sql.'<br/>'.mysql_error());
    }
    A priori il n'a pas aimé l'accolade donc je l'ai enlevé...

    Après avoir fais des recherches test, voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur sur SELECT * FROM location WHERE prix < 701 AND prix > de AND (type = studio OR type = f1 OR type = f2) AND (departement = paris OR departement = hauts_de_seine)
    Unknown column 'de' in 'where clause'
    Vu que je suis débutant, je comprends pas grand chose ...

Discussions similaires

  1. Requete en fonction de critère "date"
    Par b747fred dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/08/2006, 15h32
  2. Réponses: 6
    Dernier message: 20/07/2006, 11h25
  3. affiche résultat en fonction du login windows
    Par bichonjp dans le forum ASP
    Réponses: 4
    Dernier message: 18/08/2005, 16h04
  4. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00
  5. Ajouter un signe avant résultat en fonction du champ
    Par davyd dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/03/2005, 11h59

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