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 :

recherche multicritère avec resultat en lien pour affichage


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 47
    Points : 23
    Points
    23
    Par défaut recherche multicritère avec resultat en lien pour affichage
    Bonjour à tous,
    j'ai des difficultés avec ma recherche multicritère. j'ai fait ce code
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     <?php
     /*<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">*/
    //header("pragma:no-cache");
    // connexion au serveur MySQL
    	$base_id = mysql_connect("localhost", "script_php", "zh6tjPp6T56N4dbF")
    	or exit("<p>Impossible de se connecter au serveur MySQL : ".mysql_error()."</p>\n");
    	// sélection de la base
    	$selection = mysql_select_db("exercices_php", $base_id)
    	or exit("<p>Impossible de sélectionner la base : ".mysql_error()."</p>\n");
    	$formation="select * from formation";
    	$pays="select * from pays";
    //execution de la requete:on envoie la requete au serveur qui nous retourne le resultat
    $formation = mysql_query($formation)
    	or exit("<p>La requête au serveur MySQL a échoué : ".mysql_error()."</p>\n");
    	$pays = mysql_query($pays)
    	or exit("<p>La requête au serveur MySQL a échoué : ".mysql_error()."</p>\n");
    	$ligneformation=mysql_fetch_object($formation);
    	$lignepays=mysql_fetch_object($pays);
    ?>
      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
        <head>
            <title>Recherche d'étudiants</title>
    		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
        </head>
        <body>
    		<h2>Recherche d'étudiants</h2>
    		<form method="post" action="">
    			<p>
    				<label>Nom d'étudiant </label>
    				<?php
    				// si un nom a été saisi (lors de la recherche précédente),
    				// on remplit le champ avec ce nom (conservation de la saisie texte)
                    echo '<input type="text" name="nom" value="'
    				     .(isset($_POST['nom']) ? htmlspecialchars($_POST['nom']) : '').'" />';
                    echo "\n";
                    ?>
    				<br>
    Formation : <select name="formation">
    <option value="général" selected>Indifférent</option>
    <option value="Master M1" <?php if ("$ligneformation->nom"=="Master M1") echo "selected";?>>Master M1</option>
    <option value="Master M2" <?php if ("$ligneformation->nom"=="Master M2") echo "selected";?>>Master M2</option>
    <option value="DU CPM" <?php if ("$ligneformation->nom"=="DU CPM") echo "selected";?>>DU CPM</option>
    <option value="DU TBM" <?php if ("$ligneformation->nom"=="DU TBM") echo "selected";?>>DU TBM</option>
    </select><br>
    Pays : <select name="pays">
    <option value="général" selected>Indifférent</option> 
    <option value="France" <?php if ("$lignepays->nom"=="France") echo "selected";?>>France</option>
    <option value="Maroc" <?php if ("$lignepays->nom"=="Maroc") echo "selected";?>>Maroc</option>
    <option value="Burkina Faso" <?php if ("$lignepays->nom"=="Burkina Faso") echo "selected";?>>Burkina Faso</option>
    <option value="Irlande" <?php if ("$lignepays->nom"=="Irlande") echo "selected";?>>Irlande</option>
    <option value="Sénégal" <?php if ("$lignepays->nom"=="Sénégal") echo "selected";?>>Sénégal</option>
    </select><br>
    Naissance entre l'année : <select name="année1">
    <option value="général" selected> Indifférent</option>
    <option value="1989" <?php echo "selected";?>>1989</option>
    <option value="1988" <?php echo "selected";?>>1988</option>
    <option value="1987" <?php echo "selected";?>>1987</option>
    <option value="1986" <?php echo "selected";?>>1986</option>
    <option value="1985" <?php echo "selected";?>>1985</option>
    <option value="1984" <?php echo "selected";?>>1984</option>
    <option value="1983" <?php echo "selected";?>>1983</option>
    <option value="1982" <?php echo "selected";?>>1982</option>
    <option value="1981" <?php echo "selected";?>>1981</option>
    <option value="1980" <?php echo "selected";?>>1980</option>
    <option value="1979" <?php echo "selected";?>>1979</option>
    <option value="1978" <?php echo "selected";?>>1978</option>
    <option value="1977" <?php echo "selected";?>>1977</option>
    <option value="1976" <?php echo "selected";?>>1976</option>
    </select> 
    et l'année : <select name="année2">
    <option value="général" selected> Indifférent</option>
    <option value="1989" <?php echo "selected";?>>1989</option>
    <option value="1988" <?php echo "selected";?>>1988</option>
    <option value="1987" <?php echo "selected";?>>1987</option>
    <option value="1986" <?php echo "selected";?>>1986</option>
    <option value="1985" <?php echo "selected";?>>1985</option>
    <option value="1984" <?php echo "selected";?>>1984</option>
    <option value="1983" <?php echo "selected";?>>1983</option>
    <option value="1982" <?php echo "selected";?>>1982</option>
    <option value="1981" <?php echo "selected";?>>1981</option>
    <option value="1980" <?php echo "selected";?>>1980</option>
    <option value="1979" <?php echo "selected";?>>1979</option>
    <option value="1978" <?php echo "selected";?>>1978</option>
    <option value="1977" <?php echo "selected";?>>1977</option>
    <option value="1976" <?php echo "selected";?>>1976</option>
    </select><br>
    				<input type="submit" name="recherche" value="Rechercher" />
    			</p>
    		</form>
     
    <?php
     
    // Si une recherche a été effectuée (bouton "Rechercher" cliqué) :
    if (isset($_POST['recherche'])) {
     
    	// connexion au serveur MySQL
    	$base_id = mysql_connect("localhost", "script_php", "zh6tjPp6T56N4dbF")
    	or exit("<p>Impossible de se connecter au serveur MySQL : ".mysql_error()."</p>\n");
    	// sélection de la base
    	$selection = mysql_select_db("exercices_php", $base_id)
    	or exit("<p>Impossible de sélectionner la base : ".mysql_error()."</p>\n");
     
    	// Recherche des étudiants dans la base de données
    	// début de construction de la requête : par défaut, on sélectionne tous les étudiants
    	$requete = "SELECT etudiant.nom, etudiant.prenom FROM etudiant ";
    	$requete2 = "SELECT distinct (etudiant.nom), etudiant.prenom FROM etudiant,formation,pays ";
    if ($_POST['formation'] and empty($_POST['nom']) and $_POST['pays'] and $_POST['année1'] and $_POST['année2']) {
    	$formation=$_POST['formation'];
    	$pays=$_POST['pays'];
    	$année1=$_POST['année1'];
    	$année2=$_POST['année2'];
    	if ($formation!='Indifférent' and $année1!='Indifférent' and $année2!='Indifférent' and $pays!='Indifférent')
    	{
    		$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND extract(year FROM etudiant.date_naissance) BETWEEN '$année1' and '$année2' AND pays.nom= '$pays' AND formation.nom = '$formation'";
    	}
    		else
    		if ($formation='Indifférent' and $année1!='Indifférent' and $année2!='Indifférent' and $pays!='Indifférent')
    		{
    			$requete2.= "WHERE pays.id_pays=etudiant.id_pays AND extract(year FROM etudiant.date_naissance) BETWEEN '$année1' and '$année2' AND pays.nom= '$pays'";
    		}
    			else
    			if ( $formation='Indifférent' and $pays='Indifférent' and $année1!='Indifférent' and $année2!='Indifférent') 
    			{
    				$requete2.= "WHERE extract(year FROM etudiant.date_naissance) BETWEEN '$année1' and '$année2'";
    			}
    				else
    				if ($formation='Indifférent' and $pays='Indifférent' and $année1='Indifférent' and $année2!='Indifférent') 
    				{
    				$requete2.= "WHERE extract(year FROM etudiant.date_naissance)='$année2'";
    				}
    					else
    					if ($formation='Indifférent' and $pays='Indifférent' and $année1!='Indifférent' and $année2='Indifférent') 
    					{
    					$requete2.= "WHERE extract(year FROM etudiant.date_naissance)='$année1'";
    						}
    						else
    						if ($formation!='Indifférent' and $pays!='Indifférent' and $année1='Indifférent' and $année2='Indifférent') {
    						$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND pays.nom= '$pays' AND formation.nom = '$formation'";
    						}
    							else
    							if ($formation!='Indifférent' and $pays!='Indifférent' and $année1='Indifférent' and $année2='Indifférent') 
    							{
    							$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND pays.nom='$pays' AND formation.nom = '$formation'";
    							}
    								else
    								if ($formation='Indifférent' and $pays!='Indifférent' and $année1='Indifférent' and $année2='Indifférent') 
    								{
    								$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND pays.nom= '$pays'";
    								}
    									else
    									if ($formation!='Indifférent' and $pays='Indifférent' and $année1='Indifférent' and $année2='Indifférent') 
    									{
    									$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND formation.nom = '$formation'";
                                        }
    	}
    	//}
    	//}
    	//}
    	// fin de construction de la requête : classement des résultats 
    	// par ordre alphabétique des noms, puis des prénoms
    	$requete2 .= "ORDER BY etudiant.nom,etudiant.prenom ;";
    	// exécution de la requête sur la base de données
    	$etudiants2 = mysql_query($requete2)
    	or exit("<p>La requête au serveur MySQL a échoué : ".mysql_error()."</p>\n");
    	// Affichage des étudiants trouvés
    	echo "<h2>Résultat2</h2>\n";
    	$etudiant3 = mysql_fetch_array($etudiants2);	
    	if (!$etudiant3)
    		echo "<p>Aucun étudiant ne correspond à votre recherche.</p>\n";
    	// autre cas : il y a au moins un étudiant à afficher
    	else
    		// écriture d'un paragraphe par étudiant trouvé
    		do
    		     echo "<p>".htmlspecialchars(strtoupper($etudiant3['nom']))." "
    				 .htmlspecialchars(strtoupper($etudiant3['prenom']))." </p>\n";
    				 /*?>
    		    <a href="recherche_etudiants.php?<?php echo "<p>".htmlspecialchars(strtoupper($etudiant3['nom']))." "
    				 .htmlspecialchars(strtoupper($etudiant3['prenom']))." </p>\n";?>"></a><br>
    		<?		 */
    		while ($etudiant3 = mysql_fetch_array($etudiants2));	
     
    }
    je sais c'est long,mais pas trop compliqué.
    et voilà la recherche multicritère ne se fait pas comme je le souhaite. elle n'exécute que la première condition. en fait j'ai des listes deroulantes et je voudrais que la requete prenne en compte ce qui est selectionné dans la liste. mais surement j'ai mal imbriqué mes IF. quelqu'un peut-il regarder?
    Merci.

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Deux petites choses avant de continuer:
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $formation="select * from formation";
    //execution de la requete:on envoie la requete au serveur qui nous retourne le resultat
    $formation = mysql_query($formation)
    Je trouve plus clair d'utiliser des noms de variables comme $querryFormation, $resultFormation par exemple au lieu d'utiliser la même variable (c comme tu veux)

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $année1=$_POST['année1'];
    Il faut éviter d'utiliser des ponctuations dans les noms de variables donc plutôt $annee1

    Puis) Il est recommandé d'utiliser le mot clés JOIN pour faire des jointure, le where pour les jointures ça date
    ex pour ton premier if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $requete2 = "SELECT distinct (e.nom), e.prenom FROM etudiant as e ";
    // Un if, disons le premier
    $requete2.= "INNER JOIN formation as f ON f.id_formation = e.id_formation 
                        INNER JOIN pays as p ON p.id_pays=e.id_pays
                        ....";
    Sinon je regarde tes if, ... pour l'instant rien vu
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    une petite remarque : tu fais de l'informatique et pas du français donc je commencerai par virer tous les accents dans le nommage des variables Ensuite essaye de mieux séparer ton traitement de ta présentation.

    Et pour le montage du WHERE, utilises quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $where = array();
    $where[] = "table.cola = '$filtre_a'";
    $where[] = "table.colb = '$filtre_b'";
     
    $sql_where = implode("\n", $where);

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je vous remercie pour vos remarques, je vais apporter des modifications à mon code. Mais le problème demeure si j'exécute cette requete avec une sule condition à la fois ça marche. toutes ces requêtes ont été testés et elles affichent le résultat voulu. mais lorsque je les mets toutes avce des IF seule la première condition est respectée les autres ne suivent pas selon ces IF. c'est pour cela que je pense que il ya un problème au niveau de la structuration des IF.
    Mais je n'arrive pas à voir ce qu'il ya.

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bien que j'aime bien la méthode avec les where de Martin, tu as essayé un truc plus court genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ($formation!='Indifférent' and $année1!='Indifférent' and $année2!='Indifférent' and $pays!='Indifférent')
    		$requete2.= "WHERE formation.id_formation = etudiant.id_formation AND pays.id_pays=etudiant.id_pays AND extract(year FROM etudiant.date_naissance) BETWEEN '$année1' and '$année2' AND pays.nom= '$pays' AND formation.nom = '$formation'";
    else if ($formation='Indifférent' and $année1!='Indifférent' and $année2!='Indifférent' and $pays!='Indifférent')
    		$requete2.= "WHERE pays.id_pays=etudiant.id_pays AND extract(year FROM etudiant.date_naissance) BETWEEN '$année1' and '$année2' AND pays.nom= '$pays'";
    ...
    ET puis sinon, c'est surtout des == et non = pour les tests
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    j'ai mis des == là où il faut, changé année en annee refais l'affichage de mon code mais toujours rien

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Dans ce cas, clarifies ton code pour bien cerné le pb ... comme par exemple enléves les $requete2 .= par des echo 'ici', ou 'là' etc pour déjà traiter ton problème des if, puis ensuite tu écrieras bien tes requêtes ... (par les where de Martin et les JOIN de moi).
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    j'ai revu mon code, j'ai vu mon erreur en fait, au niveau de la première valeur du option je mettais général au lieu de Indifférent j'ai fais un echo pour qu'il m'affiche ce qu'il trouve dans ce value il m'affichait général. normal que les requêtes ne s'éxécutent pas. je lui demandais de vérifier quelque chose donc le critère correspondait pas à celui de la recherche.
    Merci pour ceux qui ont bien voulu se pencher sur mon pb.

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

Discussions similaires

  1. Recherche multicritère avec VB excel
    Par mathieu03101987 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/11/2009, 22h06
  2. [MySQL] Recherche multicritère avec plusieurs mots
    Par rblade dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/08/2008, 12h26
  3. Recherche multicritère avec C# & Sql server 2k5
    Par Invité dans le forum Accès aux données
    Réponses: 3
    Dernier message: 26/05/2008, 23h50
  4. Requête de recherche multicritère avec filtre
    Par totoff80 dans le forum Bases de données
    Réponses: 22
    Dernier message: 18/04/2008, 15h03
  5. Réponses: 8
    Dernier message: 16/02/2008, 10h30

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