Page 1 sur 2
Menus déroulants de selection multicritères
Posté : 01 oct. 2005, 12:03
par SpcK
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
Posté : 01 oct. 2005, 12:27
par Cyrano
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.
Posté : 01 oct. 2005, 18:11
par SpcK
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
Posté : 01 oct. 2005, 19:10
par Cyrano
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();
?>
Posté : 01 oct. 2005, 21:38
par SpcK
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
@+
Posté : 01 oct. 2005, 21:51
par Truc
Il y a une toute petite erreur au niveau du "count" mauvais placement des parenthèses.
Posté : 01 oct. 2005, 22:02
par SpcK
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
Posté : 01 oct. 2005, 22:15
par Truc
affiche la requete tel qu'elle va etre exécutée... echo $sql; apres le test sur le "count".
Posté : 01 oct. 2005, 23:27
par SpcK
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
@+
Posté : 02 oct. 2005, 01:10
par SpcK
Super cool votre aide chez Phpfrance
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
Posté : 02 oct. 2005, 10:22
par Cyrano
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']); ?>" />
Posté : 04 oct. 2005, 18:22
par SpcK
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
Posté : 04 oct. 2005, 19:04
par Truc
parcequ'il y avait un oubli, la redirection implique du javascript, et il faut le lui dire
<input tye="button" name="bouton_refaire" value="Re-initialiser" onclick="javascript:window.location:' <?php echo($_SERVER['PHP_SELF']); ?>'" />
Posté : 04 oct. 2005, 19:25
par Cyrano
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.
Posté : 05 oct. 2005, 10:56
par SpcK
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
