Menus déroulants de selection multicritères

SpcK
Invité n'ayant pas de compte PHPfrance

01 oct. 2005, 12:03

Attention super débutant !!!

Salut à tous, j'ai un peu recherché (surement mal) et rien trouvé pour répondre à ma question.

Ma page affiche pour l'instant tous les enregistrements de la table (http://tableaux.tennis.free.fr/draws.php)

Je voudrais ajouter des menus déroulants de sélection en haut.
Ces menus seront par défaut à "Choisir l'année" "Choisir le tournoi"......et alimentés par les valeurs trouvées dans la base (select distinct).
Quand on selectionne les filtres et execute le formulaire, une requête affiche les enregistrements correspondants aux critères choisis.
Par défaut au chargement de la page (avant de filtrer), seule l'année en cours est affichée.

Est-ce que quelqu'un aurait un exemple de code qui réalise cela afin que je puisse m'en inspirer.

Merci d'avance pour votre aide

Mammouth du PHP | 19672 Messages

01 oct. 2005, 12:27

Hé bien fais des requête SELECT DISTINCT(annee) et SELECT DISTINCT(tournoi). Ensuite, récupères les résultats et alimente une boucle.
Exemple : dans un premier temps, on va créer la liste des tournois:
<?php
/* On considère que la connexion est faite */
/* Création de la requête */
$sql = "SELECT DISTINCT(tournoi) ORDER BY tournoi ASC";
/* exécution de la requête */
$resultat = mysql_query($sql);
/* On prépare et on alimente la liste déroulante */
?>
<form action="" method="post" id="tournois_form">
  <select name="tournoi" id="tournoi" onchange="document.forms['tournois_form'].submit();">
<?php
while($ligne = mysql_fetch_assoc($resultat))
{
?>
    <option value="<?php echo($ligne['tournoi']); ?>"><?php echo($ligne['tournoi']); ?></option>
<?php
}
?>
  </select>
</form>
Dans un second temps, en début de page, on va ajouter un élément de récupération, lis bien les commentaires, ils sont importants:
<?php
/* ~~~~~~~~~ Récupération au rechargement ~~~~~~~~~ */
$tournoi = isset($_POST['tournoi']) ? $_POST['tournoi'] : null;
/* Au moment de créer la requête pour l'affichage du tableau, on teste si tournoi existe pour rajouter une clause WHERE */
if(isset($tournoi))
{
    $requete .= " WHERE tournoi = '". $tournoi ."'";
}
?>
Intègre ça dans ton code et fais la même chose pour l'année.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

SpcK
Invité n'ayant pas de compte PHPfrance

01 oct. 2005, 18:11

Merci de ton aide Cyrano, ça commence à prendre forme.
J'ai néanmoins un pb de taille, certainement lié à mon faible niveau : mes menus de sélection sont initialisés à vide (option value="") et donc si je ne sélectionne rien dans la boîte je devrais obtenir tous les enregistements. Malheureusement, cela ne sort rien en résultat.
Voici mon code (désolé pour la goreterie)
/* Création des des requêtes */ 
$sql_nom = "SELECT DISTINCT(nom) from tableaux ORDER BY nom ASC";
$sql_annee = "SELECT DISTINCT(annee) from tableaux ORDER BY annee ASC";
$sql_type = "SELECT DISTINCT(type) from tableaux ORDER BY type ASC"; 
$sql_sexe = "SELECT DISTINCT(sexe) from tableaux ORDER BY sexe ASC"; 
$sql_vainqueur = "SELECT DISTINCT(vainqueur) from tableaux ORDER BY vainqueur ASC"; 
/* exécution des requêtes */ 
$resultat_nom = mysql_query($sql_nom); 
$resultat_annee = mysql_query($sql_annee);
$resultat_type = mysql_query($sql_type);
$resultat_sexe = mysql_query($sql_sexe);
$resultat_vainqueur = mysql_query($sql_vainqueur);
/* On prépare et on alimente les listes déroulantes */ 
?>
<form action="" method="post" id="tournois_form">
<input type="submit" value="Envoyer" name="B1">
  <select name="tournoi" id="tournoi"> 
  <option value="">Tournoi ?</option>
<? 
while($ligne_nom = mysql_fetch_assoc($resultat_nom)) 
{ 
?> 
    <option value="<?php echo($ligne_nom ['nom']); ?>"><?php echo($ligne_nom['nom']); ?></option> 
<? 
} 
?> 
  </select>
  <select name="annee" id="annee"> 
  <option value="">Année ?</option>
<? 
while($ligne_annee = mysql_fetch_assoc($resultat_annee)) 
{ 
?> 
    <option value="<?php echo($ligne_annee['annee']); ?>"><?php echo($ligne_annee['annee']); ?></option> 
<? 
} 
?> 
  </select>
  <select name="type" id="type"> 
  <option value="">Type ?</option>
<? 
while($ligne_type = mysql_fetch_assoc($resultat_type)) 
{ 
?> 
    <option value="<?php echo($ligne_type['type']); ?>"><?php echo($ligne_type['type']); ?></option> 
<? 
} 
?> 
  </select>
  <select name="sexe" id="sexe"> 
  <option value="">Sexe ?</option>
<? 
while($ligne_sexe = mysql_fetch_assoc($resultat_sexe)) 
{ 
?> 
    <option value="<?php echo($ligne_sexe['sexe']); ?>"><?php echo($ligne_sexe['sexe']); ?></option> 
<? 
} 
?> 
  </select>
  <select name="vainqueur" id="vainqueur"> 
  <option value="">Vainqueur ?</option>
<? 
while($ligne_vainqueur = mysql_fetch_assoc($resultat_vainqueur)) 
{ 
?> 
    <option value="<?php echo($ligne_vainqueur['vainqueur']); ?>"><?php echo($ligne_vainqueur['vainqueur']); ?></option> 
<? 
} 
?> 
  </select>
</form> 

<?
/* ~~~~~~~~~ Récupération au rechargement ~~~~~~~~~ */ 
$nom = isset($_POST['tournoi']) ? $_POST['tournoi'] : null; 
$annee = isset($_POST['annee']) ? $_POST['annee'] : null;
$sexe = isset($_POST['sexe']) ? $_POST['sexe'] : null;
$type = isset($_POST['type']) ? $_POST['type'] : null;
$vainqueur = isset($_POST['vainqueur']) ? $_POST['vainqueur'] : null;

/* Au moment de créer la requête pour l'affichage du tableau, on teste si tournoi existe pour rajouter une clause WHERE */ 

$sql = 'SELECT * FROM tableaux WHERE annee<>""'; 

if(isset($nom)) 
{ 
    $sql .= " and nom = '". $nom ."'"; 
} 

if(isset($annee)) 
{ 
    $sql .= " and annee = '". $annee ."'"; 
}

if(isset($type)) 
{ 
    $sql .= " and type = '". $type ."'"; 
}

if(isset($sexe)) 
{ 
    $sql .= " and sexe = '". $sexe ."'"; 
}

if(isset($vainqueur)) 
{ 
    $sql .= " and vainqueur = '". $vainqueur ."'"; 
}

$requete = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
$total = mysql_num_rows($requete);

// on fait une boucle qui va faire un tour pour chaque enregistrements 
while($data = mysql_fetch_array($requete)) 


// si on a récupéré un résultat on l'affiche.
if($total) {


// debut du tableau
    echo '<table bgcolor="#FFFFFF">'."\n";


        echo '<tr>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Annee</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Tournoi</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Type</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Catégorie</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Vainqueur</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Finaliste</b></font></td>';
        echo '<td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Score</b></font></td>';
        echo '</tr>'."\n";



// on fait une boucle qui va faire un tour pour chaque enregistrements 
while($data = mysql_fetch_array($requete)) 

{
		
        echo '<tr>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000">'.$data['Annee'].'</font></td>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><a href='.$data['url'].' target="_blank">'.$data['Nom'].'</a></font></td>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000">'.$data['Type'].'</font></td>';
        echo '<td bgcolor="#FFFFFF"><p align="center"><font face="Verdana" size="1" color="#008000">'.$data['Sexe'].'</font></td>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000">'.$data['Vainqueur'].'</font></td>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000">'.$data['Finaliste'].'</font></td>';
        echo '<td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000">'.$data['Score'].'</font></td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
    // fin du tableau.
}

else echo 'Pas d\'enregistrements dans cette table...';

// on ferme la connexion à mysql 
mysql_close(); 
?> 
J'ai également un second petit pb : même lorsque mes sélections se déroulent correctement, je n'affiche jamais le premier enregistrement correspondant à ma requête.

Merci d'avance

Mammouth du PHP | 19672 Messages

01 oct. 2005, 19:10

Il y a du foul dans ta construction de requête, essaye comme ça, je te laisse découvrir les modification/suppressions/ajouts et tiens moi au courant de l'évolution :
<?php
/* ~~~~~~~~~ Récupération au rechargement ~~~~~~~~~ */
$nom       = isset($_POST['tournoi'])   ? $_POST['tournoi']   : null;
$annee     = isset($_POST['annee'])     ? $_POST['annee']     : null;
$sexe      = isset($_POST['sexe'])      ? $_POST['sexe']      : null;
$type      = isset($_POST['type'])      ? $_POST['type']      : null;
$vainqueur = isset($_POST['vainqueur']) ? $_POST['vainqueur'] : null;

/* Création des des requêtes */
$sql_nom       = "SELECT DISTINCT(nom) from tableaux ORDER BY nom ASC";
$sql_annee     = "SELECT DISTINCT(annee) from tableaux ORDER BY annee ASC";
$sql_type      = "SELECT DISTINCT(type) from tableaux ORDER BY type ASC";
$sql_sexe      = "SELECT DISTINCT(sexe) from tableaux ORDER BY sexe ASC";
$sql_vainqueur = "SELECT DISTINCT(vainqueur) from tableaux ORDER BY vainqueur ASC";
/* exécution des requêtes */
$resultat_nom       = mysql_query($sql_nom);
$resultat_annee     = mysql_query($sql_annee);
$resultat_type      = mysql_query($sql_type);
$resultat_sexe      = mysql_query($sql_sexe);
$resultat_vainqueur = mysql_query($sql_vainqueur);
/* On prépare et on alimente les listes déroulantes */
?>
<form action="" method="post" id="tournois_form">
  <input type="submit" value="Envoyer" name="B1">
  <select name="tournoi" id="tournoi">
  <option value="">Tournoi ?</option>
<?
while($ligne_nom = mysql_fetch_assoc($resultat_nom))
{
    $selected1 = (isset($nom) && $nom == $ligne_nom['nom']) ? " selected=\"selected\"" : null;
?>
  <option value="<?php echo($ligne_nom ['nom']); ?>"<?php echo($selected1); ?>><?php echo($ligne_nom['nom']); ?></option>
<?
}
?>
  </select>
  <select name="annee" id="annee">
  <option value="">Année ?</option>
<?
while($ligne_annee = mysql_fetch_assoc($resultat_annee))
{
    $selected2 = (isset($annee) && $annee == $ligne_annee['annee']) ? " selected=\"selected\"" : null;
?>
  <option value="<?php echo($ligne_annee['annee']); ?>"<?php echo($selected2); ?>><?php echo($ligne_annee['annee']); ?></option>
<?
}
?>
  </select>
  <select name="type" id="type">
  <option value="">Type ?</option>
<?
while($ligne_type = mysql_fetch_assoc($resultat_type))
{
    $selected3 = (isset($type) && $type == $ligne_type['type']) ? " selected=\"selected\"" : null;
?>
  <option value="<?php echo($ligne_type['type']); ?>"<?php echo($selected3); ?>><?php echo($ligne_type['type']); ?></option>
<?
}
?>
  </select>
  <select name="sexe" id="sexe">
  <option value="">Sexe ?</option>
<?
while($ligne_sexe = mysql_fetch_assoc($resultat_sexe))
{
    $selected4 = (isset($sexe) && $sexe == $ligne_sexe['sexe']) ? " selected=\"selected\"" : null;
?>
  <option value="<?php echo($ligne_sexe['sexe']); ?>"<?php echo($selected4  ); ?>><?php echo($ligne_sexe['sexe']); ?></option>
<?
}
?>
  </select>
  <select name="vainqueur" id="vainqueur">
  <option value="">Vainqueur ?</option>
<?
while($ligne_vainqueur = mysql_fetch_assoc($resultat_vainqueur))
{
    $selected5 = (isset($vainqueur) && $vainqueur == $ligne_vainqueur['vainqueur']) ? " selected=\"selected\"" : null;
?>
  <option value="<?php echo($ligne_vainqueur['vainqueur']); ?>"<?php echo($selected5); ?>><?php echo($ligne_vainqueur['vainqueur']); ?></option>
<?
}
?>
  </select>
</form>
<?
/* Au moment de créer la requête pour l'affichage du tableau, on teste si tournoi existe pour rajouter une clause WHERE */

$sql = "SELECT * FROM tableaux";
$clauses = array();
if(isset($nom))
{
    $clauses[] = "nom = '". $nom ."'";
}
if(isset($annee))
{
    $clauses[] = "annee = '". $annee ."'";
}
if(isset($type))
{
    $clauses[] = "type = '". $type ."'";
}
if(isset($sexe))
{
    $clauses[] = "sexe = '". $sexe ."'";
}
if(isset($vainqueur))
{
    $clauses[] = "vainqueur = '". $vainqueur ."'";
}
if(count($clauses >= 1))
{
    $tri = implode(" AND ", $clauses);
    $sql .= " WHERE ". $tri;
}

$requete = mysql_query($sql) or die("Erreur SQL !<br>". $sql ."<br>". mysql_error());
$total = mysql_num_rows($requete);

// si on a récupéré un résultat on l'affiche.
if($total > 0)
{
    // debut du tableau
?>
<table bgcolor="#FFFFFF">
  <tr>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Annee</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Tournoi</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Type</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Catégorie</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Vainqueur</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Finaliste</b></font></td>
    <td bgcolor="#FFAD29"><p align="center"><font face="Verdana" size="1" color="#FFFFFF"><b>Score</b></font></td>
  </tr>
<?php
// on fait une boucle qui va faire un tour pour chaque enregistrements
while($data = mysql_fetch_array($requete))
{
?>
  <tr>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><?php echo($data['Annee']); ?></font></td>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><a href="<?php echo($data['url']); ?>" target="_blank"><?php echo($data['Nom']); ?></a></font></td>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><?php echo($data['Type']); ?></font></td>
    <td bgcolor="#FFFFFF"><p align="center"><font face="Verdana" size="1" color="#008000"><?php echo($data['Sexe']); ?></font></td>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><?php echo($data['Vainqueur']); ?></font></td>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><?php echo($data['Finaliste']); ?></font></td>
    <td bgcolor="#FFFFFF"><font face="Verdana" size="1" color="#008000"><?php echo($data['Score']); ?></font></td>
  </tr>
<?php
}
?>
</table>
<?php
// fin du tableau.
}
else
{
?>
<p>Pas d'enregistrements dans la catégorie sélectionnée...</p>
<?php
}
// on ferme la connexion à mysql
mysql_close();
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

SpcK
Invité n'ayant pas de compte PHPfrance

01 oct. 2005, 21:38

Merci c'est cool, j'ai appris plein de trucs dans ton code.....et il y a même encore des subtilités à explorer.

La page est visible ici : http://tableaux.tennis.free.fr/draws4.php
J'ai ajouté des echo pour afficher les valeurs sorties du formulaires et $total.

Le problème réside encore dans la gestion de la sélection vide qui ne devrait pas exécuter le WHERE grace aux commandes if (isset($variable)).

Si tu sélectionnes US Open 2005 Grand Chelem H Federer, tu obtiens bien un enregistrement.
Si tu ne sélectionnes que US Open ===> 0 résultat......grumfffff

Merci encore de ton aide
@+

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 oct. 2005, 21:51

Il y a une toute petite erreur au niveau du "count" mauvais placement des parenthèses.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

SpcK
Invité n'ayant pas de compte PHPfrance

01 oct. 2005, 22:02

Merci Truc, mais même avec if(count($clauses) >= 1) cela ne fonctionne pas mieux.

Pendant que vous essayez de m'aider, je passe mon temps à alimenter ma base à la mano : pas loin de 1.000 pdf à classifier...argggg

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 oct. 2005, 22:15

affiche la requete tel qu'elle va etre exécutée... echo $sql; apres le test sur le "count".

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

SpcK
Invité n'ayant pas de compte PHPfrance

01 oct. 2005, 23:27

OK, je m'en suis sorti avec
if ($nom<>'') { $clauses[] = "nom = '". $nom ."'";}
au lieu de
 if(isset($nom)) 
{ 
    $clauses[] = "nom = '". $nom ."'"; 
} 
Merci à tous, je tiens ma requête et je vais passer au fignolage
@+

SpcK
Invité n'ayant pas de compte PHPfrance

02 oct. 2005, 01:10

Super cool votre aide chez Phpfrance :P
Ca commence à ressembler un peu à qqchose : http://tableaux.tennis.free.fr/draws4.php

Dernier pb avant le prochain : le bouton réinitialiser (reset) remet à la valeur initiale les champs de sélection avant que l'on exécute la requête. Si on l'utilise après avoir cherché, il est inefficace.

Y a un truc svp ????
Merci d'avance

Mammouth du PHP | 19672 Messages

02 oct. 2005, 10:22

L'astuce consisterait à recharger la page sans paramètres : au lieu d'un input type="reset", utilises un input type="button" : dedans, mets un gestionnaire d'évènement :
<input tye="button" name="bouton_refaire" value="Re-initialiser" onclick="window.location: <?php echo($_SERVER['PHP_SELF']); ?>" />
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 11 Messages

04 oct. 2005, 18:22

Re-Cyrano,

j'ai essayé ton code (en corrigeant tye en type et en essayant d'enlever un espace avant l'url) mais rien n'y fait : le bouton est inefficace.

Tu peux voir la page à http://tableaux.tennis.free.fr/index.php
Quand j'affiche la source, c'est interprété en html comme

Code : Tout sélectionner

<input type="button" name="bouton_refaire" value="Re-initialiser" onclick="window.location:/index.php" style="font-family: Verdana; font-size: 8 pt; color: #000080" />
Nota : je vais intégrer mes boutons et menus déroulants dans ma feuille de style....faut pas taper

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

04 oct. 2005, 19:04

parcequ'il y avait un oubli, la redirection implique du javascript, et il faut le lui dire :wink:
<input tye="button" name="bouton_refaire" value="Re-initialiser" onclick="javascript:window.location:' <?php echo($_SERVER['PHP_SELF']); ?>'" />

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

04 oct. 2005, 19:25

Non, c'est encore plus simple que ça :
<input type="button" name="bouton_refaire" value="Re-initialiser" onclick="window.location: ./index.php" style="font-family: Verdana; font-size: 8 pt; color: #000080" />
on laisse un espace après le "location:" et on fait précéder le "/" juse avant index d'un point qui indique le répertoire courant.

Teste ça et reviens avec le résultat.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 11 Messages

05 oct. 2005, 10:56

Salut, je viens donner des news aux gentils formateurs de phpfrance après quelques jours parmi vous :

- j'ai enrichi ma feuille de style et je fais maintenant appel à des class partout
- j'ai installé Wamp sur vos conseil pour mon developpement local ===> nickel
Simplement dans mes fichiers en local, je fais des requetes sur mysql.matable alors que sur free comme je n'ai qu'une seule base c'est sur matable ==> avez-vous une ruse en stock pour alléger les opérations d'upload ???
- j'ai fait un include de monfichierdeconnexion.php qui se trouve dans un répertoire avec un .htaccess qui comprend deny all ==> est-ce une solution secure ???
- mon pb de bouton re-initialiser est toujours en cours.

Merci encore à tous pour votre aide très précieuse :P