PHP :La cerise sur la gateau de la pagination

Guichoux -  
mila78 Messages postés 3 Statut Membre -
Bonjour,
J'ai un petit soucis qui me tracasse car je suis nul en mathématiques.
J'ai une ou plusieurs page(s) qui m'affiche(nt) les résultats d'une recherche.
J'ai réussi à faire la pagination grâce au tuto du site http://www.phpdebutant.org/article84.php et celà fonctionne très bien.
Je voudrais juste en fait la cerise sur le gâteau, c'est a dire qu'avant d'afficher les résultats de la recherche un petit texte dynamique soit affiché comme celui-ci :

"Résultat(s) de A à B sur TOTAL :"

J'espère que vous comprenez ma demande, et surtout j'espère ne pas poser une question qui a déjà été posée. Sinon je suis à damner.

Merci de votre lecture.
A voir également:

8 réponses

dolmenhir Messages postés 251 Statut Membre 25
 
les pages s'enchainent sur la même recherche ?
c-a-d la première envoie les 20 premiers, la deuxième les 20 suivants, la 3ème les 20 autres, etc... ?
0
Guichoux
 
Oui les pages se suivent et proviennent de la même recherche. J'imagine qu'il faut calculer des indices de début et de fin et les soustraire/additionner aux uns et aux autres en fonction de si l'utilisateur revient en arriere ou en avant. Mais je ne vois pas du tout la solution!
0
dolmenhir Messages postés 251 Statut Membre 25
 
bon,
basiquement à l'arrache
1

1. tu réalise une requete mysql pour trouver les résultats

2. au sortir de cette requeter tu peux connaitre le nombre total de réponse grace à
$maquery = "ta requete... etc....";
$result = mysql_query($maquery... etc...
$total = mysql_num_rows($result)

3. boucle pour n'afficher que les 20 premiers
$loop =0;
while($row = mysql_fetch_assoc($result)) {
if($loop < 20) {
echo $row['tes_champs'];
$loop++
}
}

4. dans ton lien qui envoie à la page suivante tu passe le en paramètre le nombre ou tu t'es arrêté ($loop)
<a href="tapage.php?loop=<?php echo $loop;?>pae suivante</a>

5. dans la page suivante tu récupères ta variable $loop via un $_GET['loop'] et tu t'en sert dans ta requete pour extraire les 20 prochains

$maquery = "ta requete... etc.... LIMIT ".$loop.", 20";

en fait, ta page de résultat peut même être la meme car si $loop >20 alors c'est pas la première et ta requete ($maquery) aura un LIMIT

$maquery = "ta requete... etc....";
if($loop>=21) {
$maquery .= " LIMIT ".$loop.", 20";
}

$result = mysql_query($maquery... etc...
$total = mysql_num_rows($result)

Pour une indication sur le résultat en cours (de A à B sur TOTAL) c'est:
echo "de ".($loop==0?"1":$loop)." à ".$loop+20." sur ".$total;

A placer au début (avant les boucle car $loop s'incrémente
Et $total est une variable locale, dont elle se pert au changement de page... vaut mieux la mettre dès sa récupération dans une constante

J'espère avoir été clair

PS : y a peut etre des coquille dans le code
0
Guichoux
 
Merci de ta réponse, mais celà ne fonctionne pas car quand je recule d'une page ou que je suis sur la page 2 et que je vais directement à la 5 les numéros des resultats sont completements éronnées. je vais fouiller tout le net pour un script qui ferait ce que je veux. Comme je l'ai dis c'est la cerise sur le gateau, c'est pas vraiment important mais toujours plus informatif.
Merci en tout cas de t'être penché sur le sujet :)
Si je trouve quelque chose je répondrais avec la source que j'ai trouvé ça devrait en aider plus d'un!
0
dolmenhir Messages postés 251 Statut Membre 25
 
si tu autorises la navigation via un numéro de page (1 2 3 4 5 ...) au lieu d'un simple "precedent" - "suivant"
faut effectivement calculer la valeur de la variable $loop à placer dans les url correspondantes
et quelque part, c'est plus simple à partir du moment où tu sais quelle quantité de résultat tu affiche par page
exemple, pour la page 4, à raison de 20 par page
<a href="tapage.php?page=4>page 4</a>

et derrière
$start = $_GET['page']*20; // on en affiche 20 par page
$maquery = "ta requete... etc.... LIMIT ".$start.", 20";
0
Guichoux
 
Bon j'ai une solution, elle marche sans avoir les numéros de page en bas mais je pense qu'avec celà devrait marcher aussi, je vais tester pour mettre tout celà en forme!
Ma solution est un peu lourde car je viens juste de la trouver (en fait je refais deux fois une meme requete à un moment, je dois juste retrouver une fonction toute bete me permettant de revenir au début d'un tableau)
Voici le code :
<?php

$nombre = 5; // on va afficher 5 résultats par page.


if (isset($_POST['limite']))
{
    $limite = $_POST['limite'];
}
else
{
    $limite = 0;
}

$req = "SELECT ... FROM ... WHERE ... LIMIT".$limite.",".$nombre";

    conectionbase();
    $count = mysql_query($req) or die('Erreur : '.mysql_error());
    $row = mysql_fetch_row($count);
    mysql_free_result($count);
    $total = $row[0];


    
    
    $debut = $limite + 1;
if (isset($_POST['limite']))
{
    $fin=$_POST['limite'];
}
else
{ 
    $fin = 0;
}
    $res = mysql_query($req) or die('Erreur : '.mysql_error());
    while ($jeuenr = mysql_fetch_array($res, MYSQL_ASSOC))
    {
        $fin = $fin + 1; // ici c'est un peu lourd car je vais réexecuter cette requete
    }
mysql_free_result($res);

    echo '<tr><td>Resultat(s) de '.$debut.' à '.$fin.' sur '.$total.'.</td></tr>'; // Voici ma cerise et ça marche vraiment bien ;)



    $res = mysql_query($req) or die('Erreur : '.mysql_error());// j'ai pas sû faire autrement car si je la réexecute pas je suis à la fin du tableau et donc rien ne s'affiche, je vais rechercher la fonction php pour revenir au début du tableau

    while ($jeuenr = mysql_fetch_array($res, MYSQL_ASSOC))
    {

        echo '<tr><td align="center">'.$debut.'.||||  <a href="
    #" onclick=\'window.open("miniQ.php?view=0&idq='.
    $jeuenr['id'].'","fenetrevolante4", "toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, left=300, top=50")\'>'.
    $jeuenr['idcol'].'</a></td></tr>';

$debut = $debut + 1;

}
mysql_free_result($res);


$limitesuivante = $limite + $nombre;

$limiteprecedente = $limite - $nombre;

echo ("<tr>");
echo ("<td align='left' width='50%'>");
if ($limite != 0)
{

echo '<form action="recherche.php" method="post">';
echo '<div align="left" style="float:left"><input type="submit" value="précédents"></div>';
echo '<input type="hidden" value="'.$limiteprecedente.'" name="limite">';
echo '<input type="hidden" value="'.$niveau1.'" name="niveau1">';
if (isset($_POST['niveau2']))
{
    echo '<input type="hidden" value="'.$niveau2.'" name="niveau2">';
}
if (isset($_POST['niveau3']))
{
    echo '<input type="hidden" value="'.$niveau3.'" name="niveau3">';
}
echo '</form>';
}
echo ("</td>");
echo ("<td align='right' width='50%'>");
if ($limitesuivante < $total)
{

echo '<form action="recherche.php" method="post">';
echo '<div align="right" style="float:right"><input type="submit" value="suivants"></div>';
echo '<input type="hidden" value="'.$niveau1.'" name="niveau1">';
if (isset($_POST['niveau2']))
{
    if (($_POST['niveau2'] != "") and ($_POST['niveau2'] != "default"))
    {
        echo '<input type="hidden" value="'.$niveau2.'" name="niveau2">';
    }
}
if (isset($_POST['niveau3']))
{
    if (($_POST['niveau3'] != "") and ($_POST['niveau3'] != "default"))
    {
        echo '<input type="hidden" value="'.$niveau3.'" name="niveau3">';
    }
}
echo '<input type="hidden" value="'.$limitesuivante.'" name="limite">';
echo '</form>';
}
echo ("</td>");
echo ("</tr>");
echo ("<table>");
}
else
{
echo "erreur";
}

?>

J'ai essayé de mettre le code en forme pour que tout le monde puisse l'adapter à sa solution.
Je vais regarder ta solution dolmenhir, et l'adapter à mon code, je te remercie de ton aide c'est vraiment sympa de t'être penché sur mon soucis!!
Si j'arrive à la passer avec les numéros de page je reposterais pour y mettre le complément.
Ha la la dire que je vais passer un BTS d'informatique (option developpeur en plus hin hin) et que je n'avais jamais fait de php auparavent...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mila
 
moi en faite j ai un probleme qui est proche mais en ajax / php merci pour l aide

j ai une page html => je remplie un formulaire _ recupere les variables avec ajax.udapter envoie le tout a une page php avec ma requete sql

ensuite la reponse est afficher dans une div sans recharger la page cela fonctionne tres bien

mais maintenant je voudrait gerer la pagination et le probleme c que mon script php envoie des donnees en get et donc recharge une nouvelle page celle de ma requete

je voudrais savoir comment rester dans cette meme div merci d avance, j ai pas mal chercher sur le net mais sans resultat : (
0
Guichoux
 
Salut,
Je pense que tu devrais passer en post, comme ça tu peux directement recuperer tes données dans un formulaire caché (au moyens des attributs "hidden" des balises) et renvoyer ce formulaire des que tu change de page vers le meme formulaire. c'est ce que j'ai fais pour un formulaire de recherche :

$nombre = 30; // on va afficher 30 résultats par page.
// mise à zero des variables excepté si elles ont étés transmises auparavent (dans le cas ou l'utilisateur passe à la page suivante')
if (isset($_POST['limite']))
{
    $limite = $_POST['limite'];
}
else
{
    $limite = 0;
}
if (isset($_POST['page']))
{
    $page = $_POST['page'];
}
else
{
    $page = 1;

}
if (isset($_POST['limite']))
{
    $fin = $_POST['limite'];
}
else
{
    $fin = 0;
}
connectSQL();
if (isset($_POST['mot']) and (trim($_POST['mot']) != ""))
    // recherche par mot clé

{
    $recherche = $_POST['mot'];
    $mode = $_POST['mode'];
    $recherche = mysql_real_escape_string(htmlentities($recherche));
    $mode = mysql_real_escape_string(htmlentities($_POST['mode']));
    if ($mode == "tous_les_mots")
    {
        $and_ou_or = 'AND'; //on utilisera AND dans la boucle
    }
    else
    {
        $and_ou_or = 'OR'; //on utilisera OR dans la boucle
    }
    if ($mode == "expression_exacte")
        //si le mode de recherche est par expression exacte

    {
        $req = "SELECT * FROM question WHERE titre LIKE '%$recherche%' ORDER BY id DESC limit ".
            $limite.",".$nombre;
        $req2 = "SELECT COUNT(id) FROM question WHERE titre LIKE '%$recherche%'";
        $res = mysql_query($req)or die('Erreur : '.mysql_error());
        $res2 = mysql_query($req)or die('Erreur : '.mysql_error());
    }
    else //si le mode de recherche n'est pas par expression exacte

    {
        $mots = explode(" ", $recherche); //séparation des mots
        $nombre_mots = count($mots); //compte le nombre de mots
        $valeur_requete = '';
        for ($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++)
            //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois

        {
            $valeur_requete .= ''.$and_ou_or.' titre LIKE \'%'.$mots[$nombre_mots_boucle].
                '%\''; //modification de la variable $valeur_requete
        }

        $valeur_requete = ltrim($valeur_requete, $and_ou_or); //suppression de AND ou de OR au début de la boucle
        $req = "SELECT * FROM question WHERE $valeur_requete ORDER BY id DESC limit ".$limite.
            ",".$nombre;

        $req2 = "SELECT COUNT(id) FROM question WHERE $valeur_requete";
        $res = mysql_query($req) or die('Erreur : '.mysql_error()); //requête avec le résultat de la boucle dedans
        $res2 = mysql_query($req)or die('Erreur : '.mysql_error());
    }
    $count = mysql_query($req2) or die('Erreur : '.mysql_error());
    $row = mysql_fetch_row($count);
    $total = $row[0];
    ; //compte le nombre d'entrées sélectionnées par la recherche
}
else //recherche par catégorie

{
    if (!isset($_POST['niveau1']) or ($_POST['niveau1'] == "default") or ($_POST['niveau1'] ==
        "")) // il faut au moins que la premiere combo est une valeur'

    {
        echo "erreur";
    }
    else
    {
        $niveau1 = $_POST['niveau1'];
        $req = "SELECT id, titre FROM question WHERE niveau1='".$niveau1."'";
        $req2 = "SELECT COUNT(id) FROM question WHERE niveau1='".$niveau1."'";
        if (isset($_POST['niveau2']))
        {
            if (($_POST['niveau2'] != "") and ($_POST['niveau2'] != "default"))
            {
                $niveau2 = $_POST['niveau2'];
                $req = $req." and niveau2='".$niveau2."'";
                $req2 = $req2." and niveau2='".$niveau2."'";
            }
        }
        if (isset($_POST['niveau3']))
        {
            if (($_POST['niveau3'] != "") and ($_POST['niveau3'] != "default"))
            {
                $niveau3 = $_POST['niveau3'];
                $req = $req." and niveau3='".$niveau3."'";
                $req2 = $req2." and niveau3='".$niveau3."'";
            }
        }
        $req = $req." limit ".$limite.",".$nombre;

        $res = mysql_query($req) or die('Erreur : '.mysql_error());
        $res2 = mysql_query($req) or die('Erreur : '.mysql_error());
        $count = mysql_query($req2) or die('Erreur : '.mysql_error());
        $row = mysql_fetch_row($count);
        $total = $row[0];
    }
}
if ($total != 0)
{
    //affichage des résultats
    $debut = $limite + 1;
    while ($jeuenr = mysql_fetch_array($res2, MYSQL_ASSOC))
    {
        $fin = $fin + 1;
    }
    mysql_free_result($res2);
    echo ("<table width='80%' align='center'>");
    echo '<tr><td colspan="3">Page '.$page.', résultat(s) de '.$debut.' à '.$fin.
        ' sur '.$total.' :</td></tr>';

    while ($jeuenr = mysql_fetch_array($res, MYSQL_ASSOC))
    {
        echo '<tr><td align="left" colspan="3">'.$debut.'.||||  <a href="#" onclick=\'window.open("miniQ.php?view=0&idq='.
            $jeuenr['id'].'","fenetrevolante4", "toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=450, height=500, left=300, top=50")\'>'.
            $jeuenr['titre'].'</a></td></tr>';
        $debut = $debut + 1;
    }
    mysql_free_result($res);

    $limitesuivante = $limite + $nombre;
    $pagesuivante = $page + 1;
    $limiteprecedente = $limite - $nombre;
    $pageprecedente = $page - 1;
    echo ("<tr>");
    echo ("<td align='left' width='33%'>");
    if ($limite != 0)
    {
        //$premierrowprécédent= $b-$a;
        echo '<form action="recherche.php" method="post">';
        echo '<div align="left" style="float:left"><input type="submit" value="précédents"></div>';
        echo '<input type="hidden" value="'.$limiteprecedente.'" name="limite">';
        if (isset($_POST['mot']) and (trim($_POST['mot']) != ""))
        {
            echo '<input type="hidden" value="'.$_POST['mot'].'" name="mot">';
            echo '<input type="hidden" value="'.$_POST['mode'].'" name="mode">';
        }
        else
        {
            echo '<input type="hidden" value="'.$niveau1.'" name="niveau1">';
            if (isset($_POST['niveau2']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau2'].'" name="niveau2">';
            }
            if (isset($_POST['niveau3']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau3'].'" name="niveau3">';
            }
        }
        echo '<input type="hidden" value="'.$pageprecedente.'" name="page">';
        echo '</form>';
    }
    echo ("</td>");
    echo ("<td align='left'>");
    $nbpages = ceil($total / $nombre);
    $numeroPages = 1;
    $compteurPages = 1;
    $limite = 0;
    while ($numeroPages <= $nbpages)
    {
        echo ("<div style='float:left'>");
        echo '<form action="recherche.php" method="post" name=page'.$numeroPages.'>';
        echo '<a href = "#"';

        if ($numeroPages == $page)
        {
            echo ("class='minitable'");
        }

        echo 'onclick="document.forms[\'page'.$numeroPages.'\'].submit();">'.$numeroPages.
            '</a>'." ";
        echo '<input type="hidden" value="'.$limite.'" name="limite">';
        if (isset($_POST['mot']) and (trim($_POST['mot']) != ""))
        {
            echo '<input type="hidden" value="'.$_POST['mot'].'" name="mot">';
            echo '<input type="hidden" value="'.$_POST['mode'].'" name="mode">';
        }
        else
        {
            echo '<input type="hidden" value="'.$niveau1.'" name="niveau1">';
            if (isset($_POST['niveau2']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau2'].'" name="niveau2">';
            }
            if (isset($_POST['niveau3']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau3'].'" name="niveau3">';
            }
        }
        echo '<input type="hidden" value="'.$numeroPages.'" name="page">';
        $limite = $limite + $nombre;
        $numeroPages = $numeroPages + 1;
        $compteurPages = $compteurPages + 1;
        if ($compteurPages == 10)
            echo '</form>';
        echo "</div>";
    }
    echo ("</td>");
    echo ("<td align='left'>");
    if ($limitesuivante < $total)
    {

        echo '<form action="recherche.php" method="post">';
        echo '<div align="left" style="float:left"><input type="submit" value="suivants"></div>';
        if (isset($_POST['mot']) and (trim($_POST['mot']) != ""))
        {
            echo '<input type="hidden" value="'.$_POST['mot'].'" name="mot">';
            echo '<input type="hidden" value="'.$_POST['mode'].'" name="mode">';
        }
        else
        {
            echo '<input type="hidden" value="'.$niveau1.'" name="niveau1">';
            if (isset($_POST['niveau2']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau2'].'" name="niveau2">';
            }
            if (isset($_POST['niveau3']))
            {
                echo '<input type="hidden" value="'.$_POST['niveau3'].'" name="niveau3">';
            }
        }
        echo '<input type="hidden" value="'.$limitesuivante.'" name="limite">';
        echo '<input type="hidden" value="'.$pagesuivante.'" name="page">';
        echo '</form>';
    }
    echo ("</td>");
    echo ("</tr>");
    echo ("<table>");
}

mysql_close($conn)


J'espère que ce bout de code est clair, il y a longtemps que je ne l'ai pas touché. Je pourrais essayer de te l'expliquer à l'occasion.
0
mila78 Messages postés 3 Statut Membre
 
merci guichoux juste une petite precision je te met mon code actuel que constitue (ma pagination) : mais je v prendre le temps d etudier le code que tu ma envoyer tres vite j apprecie bcp : )

//connexion//
require_once('Connections/myeflat.php');

//variable //
$currentPage = $_SERVER["PHP_SELF"];
$maxRows_request = 5;
$pageNum_request = 0;
if (isset($_GET['pageNum_request'])) {
$pageNum_request = $_GET['pageNum_request'];
}
$startRow_request = $pageNum_request * $maxRows_request;

// requete //
mysql_select_db($database_myeflat, $myeflat);
$query_request = sprintf("SELECT id_announcement, cle_country, cle_for, price, address, `description`, squarmeter, bedroom, bathroom, date_creation, table_towns.town, table_types.type FROM table_announcements, table_countrys, table_towns, table_types WHERE table_announcements.cle_country = table_countrys.id_country AND table_announcements.cle_type = table_types.id_type AND table_announcements.cle_town = table_towns.id_town ");

//variable du formulaire//
if(isset($_POST["1"]) && $_POST["1"]>0)
$query_request .=" AND table_announcements.cle_country = ".$_POST["1"];

if(isset($_POST["2"]) && $_POST["2"]>0)
$query_request .=" AND table_announcements.cle_town = ".$_POST["2"];

if(isset($_POST["3"]) && $_POST["3"]>0)
$query_request .=" AND table_announcements.cle_type = ".$_POST["3"];

$query_limit_request = sprintf("%s ORDER BY id_announcement DESC LIMIT %d, %d", $query_request, $startRow_request, $maxRows_request);
$request = mysql_query($query_limit_request, $myeflat) or die(mysql_error());
$row_request = mysql_fetch_assoc($request);

if (isset($_POST['totalRows_request'])) {
$totalRows_request = $_POST['totalRows_request'];
} else {
$all_request = mysql_query($query_request);
$totalRows_request = mysql_num_rows($all_request);
}
$totalPages_request = ceil($totalRows_request/$maxRows_request)-1;

$queryString_request = "";
if (!empty($_SERVER['QUERY_STRING'])) {
$params = explode("&", $_SERVER['QUERY_STRING']);
$newParams = array();
foreach ($params as $param) {
if (stristr($param, "pageNum_request") == false &&
stristr($param, "totalRows_request") == false) {
array_push($newParams, $param);
}
}
if (count($newParams) != 0) {
$queryString_request = "&" . htmlentities(implode("&", $newParams));
}
}
$queryString_request = sprintf("&totalRows_request=%d%s", $totalRows_request, $queryString_request);

// navigation //

// premiere page//
<?php if ($pageNum_request > 0) { // Show if not first page ?>
<a href="<?php printf("%s?pageNum_request=%d%s", $currentPage, 0, $queryString_request); ?>">First</a>
<?php } // Show if not first page ?>

// les pages chiffres //
<?php $last=$totalPages_request+1;$current=$pageNum_request+1;
for ($i = 1; $i <= $last; $i++) {if($current==$i){echo "<strong> ". $i . "</strong> | ";} else { ?>
<a href="<?php printf("%s?pageNum_request=%d%s", $currentPage, min($totalPages_request, $i-1), $queryString_request); ?>"><?php echo $i;?></a><?php echo " | "; ?>
<?php }}?>

// derniere page//
<?php if ($pageNum_request < $totalPages_request) { // Show if not last page ?>
<a href="<?php printf("%s?pageNum_request=%d%s", $currentPage, $totalPages_request, $queryString_request); ?>">Last</a>
<?php } ?>

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
si tu peut jeter un oeil sur ca et me dire comment je pourrait l adapter car actuelemnt ma barre de navigation utilise un lien est donc des valeurs en post comment je fait pour les transmettre en post que faut til que je change ..

merci : ']
0
mila78 Messages postés 3 Statut Membre
 
juste une petite question pour l envoie en post sans recharger??? ok mon script est pret coté php request sql mais pour envoyé les donnees??
0
guichoux
 
Alors je sais pas si je t'ai bien compris. A chague numero de page ainsi que les lien precedents et suivants de la pagination, correspond un formulaire cache en methode post qui recupre les variale de la page sur laquelle se trouve l'utilisateur (numero de page, numero du 1er resultat et numero du dernier resultat, ...) afin de calculer les suivants. c'est un code assez lourd. j'espere avoir repondu a ta question.
0
mila78 Messages postés 3 Statut Membre
 
je vien de comprendre en prenant le temps de bien relire ton code enfaite je fais un ajax.udapter en recuperant les valeurs des cahmps hidden qui sont transmi alors au serveur

merci je v voir ca demain car la j ai la tete comme une citrouille sinon je l aisserai suivant et precedent je posterai plus tard pour donner des news merci encore Gchoux// :)
0