Page 1 sur 1

Liste deroulante et affichage

Posté : 16 nov. 2006, 16:29
par fender
Bonjour à tous,

Je souhaiterais filtrer l'affichage des résultats d'une requête sql selon la date choisie dans une liste déroulante. Ma liste est remplie dynamiquement avec les dates récupérées dans la base mysql, mais le résultat (filtré) ne s'affiche pas dans ma page.

Voici mon code, si qqun peut m'aider:

J'ai 2 fichiers : interface.php et filtre.php
Les 2 autres noms de fichiers php apparaissant dans le code permettent de supprimer ou d'exporter les enregistrements, ce qui fonctionne parfaitement, donc aucun interet à les faire apparaitre ici.

interface.php

Code : Tout sélectionner

<?php function dateUsToFr ($date) { sscanf($date, "%4s%2s%2s", $y, $mo, $d); return $d.'/'.$mo.'/'.$y; } { function barre_navigation ($nb_total, $nb_affichage_par_page, $debut, $nb_liens_dans_la_barre) { $barre = ''; // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT if ($_SERVER['QUERY_STRING'] == "") { $query = $_SERVER['PHP_SELF'].'?debut='; } else { $tableau = explode ("debut=", $_SERVER['QUERY_STRING']); $nb_element = count ($tableau); if ($nb_element == 1) { $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut='; } else { if ($tableau[0] == "") { $query = $_SERVER['PHP_SELF'].'?debut='; } else { $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut='; } } } // on calcul le numéro de la page active $page_active = floor(($debut/$nb_affichage_par_page)+1); // on calcul le nombre de pages total que va prendre notre affichage $nb_pages_total = ceil($nb_total/$nb_affichage_par_page); // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin) // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11 if ($nb_liens_dans_la_barre%2==0) { $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1; $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2); } else { $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2)); $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2)); } if ($cpt_deb1 <= 1) { $cpt_deb = 1; $cpt_fin = $nb_liens_dans_la_barre; } elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) { $cpt_deb = $cpt_deb1; $cpt_fin = $cpt_fin1; } else { $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1; $cpt_fin = $nb_pages_total; } if ($nb_pages_total <= $nb_liens_dans_la_barre) { $cpt_deb=1; $cpt_fin=$nb_pages_total; } // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page if ($cpt_deb != 1) { $cible = $query.(0); $lien = '<A HREF="'.$cible.'"><<</A>&nbsp;&nbsp;'; } else { $lien=''; } $barre .= $lien; // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) { if ($cpt == $page_active) { if ($cpt == $nb_pages_total) { $barre .= "<span style='color:#000; font-weight:normal;'>".$cpt."</span>"; } else { $barre .= "<span style='color:#000; font-weight:normal;'>".$cpt."</span>&nbsp;-&nbsp;"; } } else { if ($cpt == $cpt_fin) { $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page); $barre .= "'>".$cpt."</A>"; } else { $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page); $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;"; } } } $fin = ($nb_total - ($nb_total % $nb_affichage_par_page)); if (($nb_total % $nb_affichage_par_page) == 0) { $fin = $fin - $nb_affichage_par_page; } // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation if ($cpt_fin != $nb_pages_total) { $cible = $query.$fin; $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">>></A>'; } else { $lien=''; } $barre .= $lien; return $barre; } mysql_connect("SERVER", "USER", "PWD"); mysql_select_db("DB"); $sql = 'SELECT * FROM visiteurs ORDER BY idVisiteur'; $resultat = mysql_query($sql); $nb_total = mysql_num_rows($resultat); if (!isset($_GET['debut'])) $_GET['debut'] = 0; $nb_affichage_par_page = 10; // récupère l'identifiant de la liste déroulante if( isset($_POST['choix']) && $_POST['choix'] != "" ) { $sql = "SELECT * FROM visiteurs WHERE datecontact = '".$_POST['choix']."' ORDER BY idVisiteur ASC LIMIT ".$_GET['debut'].','.$nb_affichage_par_page ; } else { $sql = "SELECT * FROM visiteurs ORDER BY idVisiteur ASC LIMIT ".$_GET['debut'].','.$nb_affichage_par_page ; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>interface</TITLE> <META content="text/html; charset=windows-1252" http-equiv=Content-Type> <SCRIPT> function SelectChoix() { var form = document.getElementById('form1'); form.submit(); } </SCRIPT> </HEAD> <BODY topmargin="0"> <TABLE width="1000" cellPadding=0 cellSpacing=0 align="center"> <TR> <TD align="left"> <TABLE width="900" cellspacing="0" cellpadding="0"> <form method="post" name="suppression" action="suppr.php"> <tr> <td><div align="center"><input type="submit" value="Supprimer"></div></td> <td><a href="javascript:void(0)" onClick="window.open('export.php')"><input type="submit" value="Exporter la liste"></a></td> <td ><?php include("filtre.php"); ?></td> </tr> <tr> <td>Date</td> <td>Site</td> <td>Civilit&eacute;</td> <td>Nom</td> <td >Pr&eacute;nom</td> <td>Adresse</td> <td>CP</td> <td>Ville</td> </tr> <?php while ($donnees = mysql_fetch_array($req)) { ?> <tr> <td align="center"><input type="checkbox" name="<?php echo $donnees['idVisiteur']; ?>" value="<?php echo $donnees['idVisiteur'] ?>"></td> <td><strong><?php echo dateUsToFr ($donnees['datecontact']); ?></strong></td> <td align="center"><?php echo $donnees['civilite']; ?></td> <td align="center"><?php echo $donnees['nom']; ?></td> <td align="center"><?php echo $donnees['prenom']; ?></td> <td align="center"><?php echo $donnees['adresse']; ?></td> <td align="center"><?php echo $donnees['codepost']; ?></td> <td align="center"><?php echo $donnees['ville']; ?></td> </tr> <?php } ?> </form> </TABLE></TD></TR> <TR><TD><div><span><?php echo '<span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>'; ?></span></div></TD></TR> </TABLE> </BODY> </HTML> <?php } ?>

filtre.php

Code : Tout sélectionner

<FORM method="POST" name="form1" action="interface.php"> <SELECT name="choix" id="form1" onChange="SelectChoix()"> <option value="" selected="selected">Tous les contacts</option> <?php $SQL = "SELECT DISTINCT datecontact FROM visiteurs"; $res = mysql_query($SQL); while($val=mysql_fetch_array($res)) { ?> <option value="<?php echo $val["datecontact"] ?>"><?php echo $val["datecontact"] ?> </option>; <?php } ?> </SELECT> </FORM>
Merci pour votre aide

Posté : 16 nov. 2006, 18:23
par Devether
Bonjour,

quand tu valides ton formulaire, la variable correspondant a ta liste est envoyé soit par POST soit par GET.

Par exemple : tu a juste a tester si $_POST['choix'] a été retourné et l'intégrer a ta requete SQL.
if (isset($_POST['choix'])) {

   $sql = 'SELECT truc FROM table WHERE id = "'.$_POST['choix'].'"';


} else {

    $sql = 'SELECT truc FROM table';

}



Posté : 16 nov. 2006, 19:27
par fender
Salut Devether, merci pour ta réponse.

Mais ce que tu me suggères, je l'ai déjà fait dans le fichier interface.php dont le code apparait plus haut.

mais ça ne fonctionne pas. :roll:

Posté : 17 nov. 2006, 10:19
par Devether
est ce que tu récupères bien ta valeur quand tu fais un echo $_POST['choix']; dans interface.php??

Posté : 17 nov. 2006, 11:39
par fender
non, en effet, lorsque je place quelque part sur la page un

Code : Tout sélectionner

<?php echo $_POST['choix'] ?>
il n'affiche pas le résulat du choix effectué dans la liste. Il y a effectivement un pb de récupération de variable mais je ne vois pas où.

Posté : 17 nov. 2006, 12:59
par Devether
C'est normal

dans ta fonction javascript SelectChoix(), tu fais un getElementById('form1').

ce qui veut dire que tu cherches a récupérer l'élément de ta page qui a pour ID => "form1".

Si tu regarde bien c'est ton <SELECT ... > qui a cet ID et non pas le formulaire. Ta page ne doit d'ailleurs même pas se recharger quand tu changes ta liste... :wink:

Posté : 17 nov. 2006, 13:27
par fender
Effectivement, la page ne se recharge pas.
J'ai modifié comme suit, mais ça ne change rien :

Code : Tout sélectionner

<FORM method="post" name="liste" id="form1" action="<?php $PHP_SELF ?>"> <SELECT name="choix" onChange="SelectChoix()"> <option value="" selected="selected">Tous les contacts</option> <?php $SQL = "SELECT DISTINCT datecontact FROM visiteurs"; $res = mysql_query($SQL) or die(mysql_error().$SQL); while($val=mysql_fetch_array($res)) { ?> <option value="<?php echo $val["datecontact"]; ?>"><?php echo dateUsToFr($val["datecontact"]) ?></option> <?php } ?> </SELECT> </FORM>
Et la fonction JS :

Code : Tout sélectionner

<SCRIPT> function SelectChoix() { var form = document.getElementById('form1'); form.submit(); } </SCRIPT>
De plus, plutôt que de faire un include de la page filtre.php, j'ai intégré le script dans interface.php.

Posté : 17 nov. 2006, 13:39
par fender
J'ai viré la fonction et mis dans mon select directement onChange="this.form.submit()".

La page est maintenant bien rafraichie lorsque je clique sur une date dans la liste mais l'affichage n'est pas filtré; la page réaffiche tous les enregistrements de ma table.

Posté : 17 nov. 2006, 14:37
par Devether
La page est maintenant bien rafraichie lorsque je clique sur une date dans la liste mais l'affichage n'est pas filtré;
J'ai fais un test avec le code de ta page et même sans mettre onChange="this.form.submit()" ça marche.

Est ce que tu récupères bien quelque chose dans $_POST['choix'] ??

si oui alors vérifie ta requête.

Posté : 17 nov. 2006, 14:50
par Devether
autre chose :

est ce que le code que tu as mis est l'intégralité de ton fichier interface.php ??

si oui alors il y a un { en trop :
function dateUsToFr ($date) {
 sscanf($date, "%4s%2s%2s", $y, $mo, $d);
 return $d.'/'.$mo.'/'.$y; }
{  // <<<< accolade en trop

Posté : 17 nov. 2006, 15:20
par fender
oui, effectivement, je ne l'avais pas remarqué. Merci.

Par contre, je ne récupère rien avec $_POST['choix'].
La page se rafraichit mais affiche toujours l'ensemble des enregistrements de la table et la liste se repositionne sur "Tous les contacts".

Posté : 17 nov. 2006, 15:57
par fender
Devether, une personne vient de m'aiguiller sur la solution que voici :

J'ai inséré mon formulaire de liste de choix dans le formulaire de la page interface.php déjà existant, et ça ne fait pas bon ménage.

Pour résoudre le problème, j'ai fait deux formulaires bien distincts et là, ça fonctionne beaucoup mieux !

Me reste plus qu'à résoudre ce problème de focus sur la date choisie dans la liste. Il doit y avoir un selected à placer au bon endroit avec une condition mais je n'y suis pas arrivé jusqu'à présent.

Posté : 17 nov. 2006, 16:13
par Devether
essaie ça :
<?php
   
function dateUsToFr($date) {
 sscanf($date, "%4s%2s%2s", $y, $mo, $d);
 return $d.'/'.$mo.'/'.$y; 
 }

   
function barre_navigation ($nb_total, $nb_affichage_par_page, $debut, $nb_liens_dans_la_barre) {
 
    $barre = '';
   
    // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT
    if ($_SERVER['QUERY_STRING'] == "") 
	{
        $query = $_SERVER['PHP_SELF'].'?debut=';
    }
    else 
	{
        $tableau = explode ("debut=", $_SERVER['QUERY_STRING']);
        $nb_element = count ($tableau);
        if ($nb_element == 1) 
		{
            $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut=';
        }
        else 
		{
        	if ($tableau[0] == "") 
			{
        		$query = $_SERVER['PHP_SELF'].'?debut=';
            }
            else 
			{
               	$query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut=';
            }
        }
    }
   
    // on calcul le numéro de la page active
    $page_active = floor(($debut/$nb_affichage_par_page)+1);
    // on calcul le nombre de pages total que va prendre notre affichage
    $nb_pages_total = ceil($nb_total/$nb_affichage_par_page);
   
    // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin)
    // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11
    if ($nb_liens_dans_la_barre%2==0) 
	{
        $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1;
        $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2);
    }
    else 
	{
        $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2));
        $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2));
    }
   
    if ($cpt_deb1 <= 1) 
	{
        $cpt_deb = 1;
        $cpt_fin = $nb_liens_dans_la_barre;
    }
    elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) 
	{
        $cpt_deb = $cpt_deb1;
        $cpt_fin = $cpt_fin1;
    }
    else 
	{
        $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1;
        $cpt_fin = $nb_pages_total;
    }
 
    if ($nb_pages_total <= $nb_liens_dans_la_barre) 
	{
        $cpt_deb=1;
        $cpt_fin=$nb_pages_total;
    }
   
    // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
    if ($cpt_deb != 1) 
	{
        $cible = $query.(0);
        $lien = '<A HREF="'.$cible.'"><<</A>&nbsp;&nbsp;';
    }
    else 
	{
        $lien='';
    }
    $barre .= $lien;
 
    // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active
    for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) 
	{
        if ($cpt == $page_active) 
		{
            if ($cpt == $nb_pages_total) 
			{
                $barre .= "<span style='color:#000; font-weight:normal;'>".$cpt."</span>";
            }
            else 
			{
                $barre .= "<span style='color:#000; font-weight:normal;'>".$cpt."</span>&nbsp;-&nbsp;";
            }
        }
        else 
		{
            if ($cpt == $cpt_fin) 
			{
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>";
            }
            else 
			{
               
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;";
            }
        }
    }
   
    $fin = ($nb_total - ($nb_total % $nb_affichage_par_page));
    if (($nb_total % $nb_affichage_par_page) == 0) 
	{
        $fin = $fin - $nb_affichage_par_page;
    }
 
        // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation
    if ($cpt_fin != $nb_pages_total) 
	{
        $cible = $query.$fin;
        $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">>></A>';
    }
    else 
	{
        $lien='';
    }
    $barre .= $lien;
 
    return $barre;   
}   
 
 
   mysql_connect("SERVER", "USER", "PWD");
   mysql_select_db("DB");
   
   $sql = 'SELECT * FROM visiteurs ORDER BY idVisiteur';
   $resultat = mysql_query($sql);
   $nb_total = mysql_num_rows($resultat);
   
   if (!isset($_GET['debut'])) $_GET['debut'] = 0;   
   $nb_affichage_par_page = 10;
   
   // récupère l'identifiant de la liste déroulante
   if( isset($_POST['choix']) && $_POST['choix'] != "" )
   
   {
   
      $sql = "SELECT * FROM visiteurs WHERE datecontact = '".$_POST['choix']."' ORDER BY idVisiteur ASC LIMIT ".$_GET['debut'].','.$nb_affichage_par_page ;
 
    } else {
   
      $sql = "SELECT * FROM visiteurs ORDER BY idVisiteur ASC LIMIT ".$_GET['debut'].','.$nb_affichage_par_page ;
   
   }
   
?>
   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>interface</TITLE>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>

<SCRIPT>
function SelectChoix()
{
document.getElementById('form1').submit();
}
</SCRIPT>
</HEAD>
 
<BODY topmargin="0">
 
<TABLE width="1000" cellPadding=0 cellSpacing=0 align="center">
<TR>
<TD align="left">
 
<TABLE width="900" cellspacing="0" cellpadding="0">
       
<form method="post" name="suppression" action="suppr.php">
 
<tr>
<td><div align="center"><input type="submit" value="Supprimer"></div></td>
<td>
<a href="javascript:void(0)" onClick="window.open('export.php')">
<input type="submit" value="Exporter la liste">
</a>
</td>
          
<td >
<FORM method="POST" name="liste" id="form1" action="">
   
<SELECT name="choix" onChange="SelectChoix()">
<option value="" selected="selected">Tous les contacts</option>
               
<?php
$SQL = "SELECT DISTINCT datecontact FROM visiteurs";
$res = mysql_query($SQL);
while($val=mysql_fetch_array($res)) { ?>
<option value="<?php echo $val["datecontact"] ?>"><?php echo $val["datecontact"] ?>
</option>
<?php } ?>
               
</SELECT>
</FORM>
</td>
</tr>
         
<tr>
<td>Date</td>
<td>Site</td>
<td>Civilit&eacute;</td>
<td>Nom</td>
<td >Pr&eacute;nom</td>
<td>Adresse</td>
<td>CP</td>
<td>Ville</td>
</tr>
          
<?php 
          
while ($donnees = mysql_fetch_array($req)) { ?>
          
<tr>
<td align="center"><input type="checkbox" name="<?php echo $donnees['idVisiteur']; ?>" value="<?php echo $donnees['idVisiteur'] ?>"></td>
<td><strong><?php echo dateUsToFr ($donnees['datecontact']); ?></strong></td>
<td align="center"><?php echo $donnees['civilite']; ?></td>
<td align="center"><?php echo $donnees['nom']; ?></td>
<td align="center"><?php echo $donnees['prenom']; ?></td>
<td align="center"><?php echo $donnees['adresse'];  ?></td>
<td align="center"><?php echo $donnees['codepost']; ?></td>
<td align="center"><?php echo $donnees['ville']; ?></td>
</tr>
<?php } ?>
</form>
</TABLE></TD></TR>
       
<TR><TD><div><span><?php echo '<span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>'; ?></span></div></TD></TR>
</TABLE> 
</BODY>
</HTML>

Posté : 17 nov. 2006, 16:45
par fender
Voilà pour mon pb de focus, j'ai fait :

Code : Tout sélectionner

<option value="<?php echo $val["datecontact"]; ?>"<?php if(isset($_POST['choix']) && $_POST['choix'] == $val["datecontact"]) { ?> selected="selected"<?php } ?>><?php echo dateUsToFr($val["datecontact"]) ?></option>
Et ça fonctionne très bien maintenant.

Merci encore pour ton aide Devether. @+ :)