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

Langage PHP Discussion :

Filtre avec pagination


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 92
    Par défaut Filtre avec pagination
    Bonjour à tous,

    Je galère sur un problème de pagination.
    En fait, j'ai créé une page interface.php dans laquelle je récupère l'ensemble des contacts enregistrés dans ma table.

    Jusque là, tout fonctionne bien. La pagination aussi.

    Dans cette page, j'ai rajouté un filtre par date dont le code est le suivant :

    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
     
    <FORM method="post" name="liste" action="interface2.php">
    <TABLE>
    <TR>
    <TD width="25" align="center">Du</TD>
    <TD>
    <SELECT name="choix">
     
    <option value="">Date de début</option>
    <?php
    $SQL = "SELECT DISTINCT datecontact FROM visiteurs ORDER BY datecontact";
    $res = mysql_query($SQL);
    while($val=mysql_fetch_array($res)) { ?>
     
    <option value="<?php echo $val["datecontact"]; ?>"<?php if(isset($_POST['choix']) && $_POST['choix'] == $val["datecontact"]) {
    ?> selected="selected" <?php } ?> > <?php echo dateUsToFr($val["datecontact"]) ?></option> <?php } ?>
     
    </SELECT>
    </TD>
    <TD width="25" align="center">au</TD>
    <TD>
    <SELECT name="choix2">
     
    <option value="">Date de fin</option>
    <?php
    $SQL = "SELECT DISTINCT datecontact FROM visiteurs ORDER BY datecontact";
    $res = mysql_query($SQL);
    while($val=mysql_fetch_array($res)) { ?>
     
    <option value="<?php echo $val["datecontact"]; ?>"<?php if(isset($_POST['choix2']) && $_POST['choix2'] == $val["datecontact"]) {
    ?> selected="selected" <?php } ?> > <?php echo dateUsToFr($val["datecontact"]) ?></option> <?php } ?>
     
    </SELECT>
    </TD>
    <TD width="25"></TD>
    <TD><input name="submit" type="submit" value="Envoyer" /></TD>
    </TR>
    </TABLE>
    </FORM>
    Une fois que je clique sur "envoyer", j'arrive sur la page interface2.php qui reprend le même système de pagination que la page interface.php mais cette fois pour la fourchette de dates que j'ai filtrée.
    Voici le code de la page interface2.php

    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
     
    <?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, $page, $nb_liens_dans_la_barre) {
    $barre = '';
     
    // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'page' qui jouera le role du premier élément de notre LIMIT
    if ($_SERVER['QUERY_STRING'] == "") {
    $query = $_SERVER['PHP_SELF'].'?page=';
    }
    else {
    $tableau = explode ("page=", $_SERVER['QUERY_STRING']);
    $nb_element = count ($tableau);
    if ($nb_element == 1) {
    $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&page=';
    }
    else {
    if ($tableau[0] == "") {
    $query = $_SERVER['PHP_SELF'].'?page=';
    }else {$query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'page=';
    }}}
     
    // on calcul le numéro de la page active
    $page_active = floor(($page/$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)
    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");
     
    if (!isset($_GET['page'])) $_GET['page'] = 0;	
    $nb_affichage_par_page = 10;
     
    // récupère l'identifiant de la liste déroulante
    if( (isset($_POST['choix']) && $_POST['choix'] != "") && (isset($_POST['choix2']) && $_POST['choix2'] != "") )
     
    { 	
    $sql = "SELECT * FROM visiteurs WHERE datecontact >= '".$_POST['choix']."' AND datecontact <= '".$_POST['choix2']."' ORDER BY idVisiteur ASC LIMIT ".$_GET['page'].','.$nb_affichage_par_page; 
    }else{
    header("Location:interface.php");
    }
    $result = mysql_query($sql);
    $nb_total = mysql_num_rows($result);
     
    // Nombre d'enregistrements dans la table
     
    $contactreq = mysql_query ("SELECT COUNT(*) FROM visiteurs WHERE datecontact >= '".$_POST['choix']."' AND datecontact <= '".$_POST['choix2']."'");
    $count = mysql_fetch_array($contactreq);
    ?>
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML><HEAD><TITLE>Contacts</TITLE>
    <META http-equiv="pragma" content="no-cache" />
    <META content="text/html; charset=windows-1252" http-equiv=Content-Type>
    </HEAD>
     
    <BODY>
    <DIV><b><?php echo $count[0]; ?></b> contacts ont été trouvés.</DIV>
    <TABLE>
    <TR><TD>Contacts></TD></TR>
    <TR><TD>
    <TABLE>
    <form method="post" name="suppression" action="suppr.php?debut=<?php echo $_GET['debut']; ?>">
    <tr>
    <td><<input type="submit" value="Supprimer"></td>
    <td>
    <input type="button" onClick="window.open('export.php')" value="Exporter la liste" />
    </td>
    </tr>
    <?php  
    $req = mysql_query($sql);
    while ($donnees = mysql_fetch_array($req)) { ?>
    <tr><td>
    <input type="checkbox" name="<?php echo $donnees['idVisiteur']; ?>" value="<?php echo $donnees['idVisiteur'] ?>"></td>
    <td><strong><?php echo dateUsToFr ($donnees['datecontact']); ?></strong></td>
    <td><?php echo $donnees['civilite']; ?></td>
    <td><?php echo $donnees['nom']; ?></td>
    <td><?php echo $donnees['prenom']; ?></td>
    <td><?php echo $donnees['adresse']; if ($donnees['adresse'] =="") {echo '-';}  ?></td>
    <td><?php echo $donnees['cp']; ?></td>
    <td><?php echo $donnees['ville']; if ($donnees['ville'] =="") {echo '-';}  ?></td>
    </tr><tr><td></td></tr><?php } ?>
    </form>
    </TABLE></TD></TR>
    <TR><TD>
    <?php echo '<span class="gras" style="font-family:Arial, Helvetica, sans-serif; font-size:11px;">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['page'], 3).'</span>'; ?>
    </TD></TR></TABLE>
    </BODY>
    </HTML>
    Mon filtre fonctionne bien mais ma barre de liens pour passer d'une page de résultats à l'autre (lorsque j'ai plus de 10 résultats) n'apparait pas correctement, j'ai juste le numéro 1.

    Alors que cette même barre avec le même script apparait bien dans ma page principale qui m'affiche tous les contacts de ma table.
    C'est pour cette raison que j'ai choisi d'envoyer vers une autre page le résultat de mon filtre car je n'arrivais pas à le faire dans le même page tout en gardant un système de pagination sur mon résultat.

    ça devient une usine à gaz et je ne m'en sors pas.
    Merci pour votre aide.

  2. #2
    NoT
    NoT est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Par défaut
    Ton code est tortueux..

    Dans ce genre de cas il faut que tu mette en place des mecanismes de debuggage : affiche au moins tes requetes ça te permettra deja d'y voir plus clair.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 92
    Par défaut
    Pour être tortueux, il l'est
    Mais, étant débutant en php, je n'ai pas les bons réflexes et j'essaye d'avancer tant bien que mal.

    Mais sur ce coup là, je suis bloqué. Je vais essayer de mettre en place un mécanisme de débuggage mais ce n'est pas gagné...

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 92
    Par défaut
    J'ai retiré ma fonction et mis ça à la place (vu sur un autre post)

    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
     
    $affichage_par_page = 10;
    $start = isset($_GET['start'])?$_GET['start']:0; //Nombre indiquant le départ de la requete
    // on cherche le nom de la page.     
    $page = basename(__FILE__); 
     
    $select = "SELECT COUNT(*) AS total FROM visiteurs WHERE datecontact >= '".$_POST['choix']."' AND datecontact <= '".$_POST['choix2']."'"; 
    $result = mysql_query($select)  or die ('Erreur : '. mysql_error()); 
    $row = mysql_fetch_array($result); 
    $total = $row['total'];
     
    if($total > 0) 
    { 
     	$select = "SELECT * FROM visiteurs WHERE datecontact >= '".$_POST['choix']."' AND datecontact <= '".$_POST['choix2']."' ORDER BY idVisiteur ASC LIMIT ".$start.','.$affichage_par_page;
    	$result = mysql_query($select)  or die ('Erreur : '.mysql_error() ); 
    	}else{
    	header("Location:ininterface.php");
    	}
    Et pour la barre de navigation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    echo 'Page : ';
    $genestart = 1;
    for($i = 1; $i <= ceil( $total_posts / $posts_per_page ); $i++)
    {
    echo '<a '.(((floor($start/$affichage_par_page)+1)==$i)?('href="'.$page.'?start='.$genestart.'"'):('')).'>'.$i.'</a>&nbsp;';
    $genestart += $affichage_par_page;
    }
    Le filtre se fait bien mais impossible de passer aux pages suivantes lorsque j'ai plus de 10 contacts : je n'ai pas de nombres(liens) dans ma barre.

  5. #5
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    ton test sur $i est mauvais. D'autre part il faudrait que tu sortes la division de la boucle, car là, tu la refais à chaque tour, tu pourrais faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $start = isset($_GET['start']) ? $_GET['start'] : 0;
    $nbPages = ceil($total_posts / $posts_per_page);
    for($i = 1; $i <= $nbPages; $i++)	{
    	echo '<a '.($genestart != $start ? 'href="'.$page.'?start='.$genestart.'"' : '').'>'.$i.'</a>&nbsp;';
    	$genestart += $posts_per_page;
    }
    Bye

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 92
    Par défaut
    Salut Djak,
    Merci pour ta réponse.
    J'ai adapté ce que tu m'as conseillé. Lorsque je selectionne une fourchette de dates, j'ai bien dans ma nouvelle page interface2.php, la barre de navigation avec les numéros de page, mais les résultats de ma requête ne s'affichent pas.
    Et si je clique sur un des numéros (liens), je reviens sur ma page interface.php avec l'affichage de tous mes contacts.

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

Discussions similaires

  1. Tableau avec tri, filtre et pagination avec entete et pied fixe
    Par Pelote2012 dans le forum Contribuez
    Réponses: 1
    Dernier message: 18/12/2016, 19h06
  2. Tableau avec tri, filtre et pagination sans plugin
    Par Pelote2012 dans le forum Contribuez
    Réponses: 0
    Dernier message: 29/07/2014, 16h26
  3. Tableau avec tri, filtre et pagination
    Par Pelote2012 dans le forum Téléchargez
    Réponses: 1
    Dernier message: 23/07/2014, 10h12
  4. Pagination et filtre avec extJS
    Par anonyhm dans le forum Ext JS / Sencha
    Réponses: 2
    Dernier message: 07/12/2010, 10h17
  5. [ZF 1.10] Mémorisation formulaire de filtre et de tri avec pagination
    Par ilalaina dans le forum Zend_Form
    Réponses: 1
    Dernier message: 24/06/2010, 11h23

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