Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 10h58   #1
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Par défaut Probleme pagination sur script recherche

Bonjour

Je viens vers vous car j'ai un soucis pour faire une pagination. Chaque fois que je met un code de pagination cela m'affiche plus de 5000 pages j'ai tout essayé et pas moyen d'y arriver j'essaie avec ce tuto http://antoine-herault.developpez.co...atique-en-php/ mais voila cela m'affiche trop de page

Voici mon code
Code :
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
157
158
159
160
161
162
163
164
165
<?php 
mysql_connect('localhost','root','password');
mysql_select_db('database');
//pagination
$messagesParPage=2; //Nous allons afficher 5 messages par page.
 
//Une connexion SQL doit être ouverte avant cette ligne...
$retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
 
if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
 
     if($pageActuelle<$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
}
 
$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
//On determine l'expression a rechercher
if(isset($_GET['search']) && strlen($_GET['search'])>2)
{
        $rec = mysql_real_escape_string(htmlspecialchars($_GET['search']));
 
//On determine le type de recherche
if(isset($_GET['type']))
{
        if($_GET['type']=='un')//Un des mots
        {
                $type = 1;
        }
        elseif($_GET['type']=='all')//Tout les mots
        {
                $type = 2;
        }
        else//L'expression exacte
        {
                $type = 3;
        }
}
else
{
        $type = 1;//type par defaut: L'expression exacte
}
//On determine si on doit surligner les mots dans les resultats
if(!isset($_GET['surligner']) or $_GET['surligner']!='true')
{
        $surligner = false;
}
else
{
        $surligner = true;
}
 
//On dertermine les identifiants, les noms et les informations des utilisateur
$req = 'SELECT * FROM download WHERE ';
if($type==1)
{//ayant un des mots dans leurs informations
        $mots = explode(' ',$rec);//En separre lexpression en mots cles
        foreach($mots as $mot)
        {
              $req .= ' keywords LIKE "%'.$mot.'%" OR (name LIKE "%'.$mot.'%") OR';
        }
        $req .= ' 1=0';
}
elseif($type==2)
{//ayant tout des mots dans leurs informations
        $mots = explode(' ',$rec);//En separre lexpression en mots cles
        foreach($mots as $mot)
        {
                $req .= ' (online = \'yes\' AND (keywords LIKE "%'.$mot.'%") OR (name LIKE "%'.$mot.'%")) AND';
        }
        $req .= ' 1=1';
}
else
{//ayant l'expression exacte dans leurs informations
        //$req .= 'keywords LIKE "%'.$rec.'%"';
		$req .= ' (online = \'yes\' AND (keywords LIKE "%'.$rec.'%") OR (name LIKE "%'.$rec.'%"))';
}
 
//Les utilisateur seront ranges par identifiant en ordre croissant
$req .= '  ORDER BY adedd DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'';
$requete = mysql_query($req);
//Le formulaire de recherche
?>
<form action="" method="get">
Expression &agrave; rechercher: <input type="text" name="search" value="<?php echo $rec; ?>" /><br />
Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="all"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br />
Mettre en gras les mots recherch&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
<input type="submit" value="Rechercher" />
</form>
<h2>R&eacute;sultats</h2>
<table>
        <tr>
                <th>Affiche</th>
                <th>Titre</th>
                <th>Mots clefs</th>
        </tr>
<?php
echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
{
     //On va faire notre condition
     if($i==$pageActuelle) //Si il s'agit de la page actuelle...
     {
         echo ' [ '.$i.' ] '; 
     }	
     else //Sinon...
     {
          echo ' <a href="search.php?page='.$i.'">'.$i.'</a> ';
     }
}
echo '</p>';
//On affiche les resultats
while($dnn = mysql_fetch_array($requete))
{
?>
        <tr>
                <td><?php echo '<img src="uploads/images/'.$dnn['image1'].'" alt="Help" width="100" />'; ?></td>
                <td><?php echo $dnn['name']; ?></td>
                <td><?php
if($surligner)//Si il faut surligner les mots, on les surligne
{
        if($type==3)
        {
                echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['keywords']);//On surligne l'expression exacte
        }
        else
        {
                echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['keywords']);//On surligne les mots cles de la recherche
        }
}
else
{
        echo $dnn['keywords'];//On ne surligne pas
}
?></td>
        </tr>
<?php
}
 
?>
</table>
<?php
}else{
?>
<form action="" method="get">
Expression &agrave; rechercher: <input type="text" name="search" value="<?php echo $rec; ?>" /><br />
Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="all"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br />
Mettre en gras les mots recherch&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
<input type="submit" value="Rechercher" />
</form>
<?php
}
?>
Pouvez-me dire ou est le probleme?? merci de votre aide
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h31   #2
Membre du Club
 
Femme Adeline
Consultant informatique
Inscription : décembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Femme Adeline
Âge : 30
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2011
Messages : 20
Points : 44
Points : 44
J'avoue n'avoir regarder que le début de ton code (la partie qui calcul le nombre de page) vu qu’apparemment c'est ça qui te pose un problème.

Il existe une fonction pour compter le nombre de ligne d'une réponse à une requete sql: mysql_num_rows, cela devrai t'aider à compter le nombre de ligne qui se trouve dans ta table download.

essaies avec quelque chose comme ça:
Code php :
1
2
3
4
5
6
//Une connexion SQL doit être ouverte avant cette ligne...
$retour_total=mysql_query("SELECT * FROM download"); //Nous récupérons le contenu de la requête dans $retour_total
$total=mysql_num_rows($retour_total); //On compte le nombre de lignes.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);

Mais je ne suis pas sur que cela résolve ton problème tu peux nous dire combien tu as d'enregistrement dans ta table et de combien il se trompe pour la pagination?
PtiteA2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 17h55   #3
Membre éprouvé
 
Avatar de guigo
 
Inscription : juin 2006
Messages : 606
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 606
Points : 479
Points : 479
bonjour,
il faut voir d'ou vient le pb :p

Code :
1
2
3
4
5
6
7
8
9
10
 
 
$messagesParPage=2; //Nous allons afficher 5 messages par page.
 
$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
 
echo "Nb total : ".$total.' / Nb de page : '.$nombreDePage;
a voir si les valeurs affichés corresponde bien a ce que tu attends....
guigo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 18h07   #4
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 466
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 466
Points : 655
Points : 655
Tu pourra faire un echo de ta requéte a la fin pour voir quece qui donne
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 19h55   #5
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Citation:
Envoyé par PtiteA2 Voir le message
J'avoue n'avoir regarder que le début de ton code (la partie qui calcul le nombre de page) vu qu’apparemment c'est ça qui te pose un problème.

Il existe une fonction pour compter le nombre de ligne d'une réponse à une requete sql: mysql_num_rows, cela devrai t'aider à compter le nombre de ligne qui se trouve dans ta table download.

essaies avec quelque chose comme ça:
Code php :
1
2
3
4
5
6
//Une connexion SQL doit être ouverte avant cette ligne...
$retour_total=mysql_query("SELECT * FROM download"); //Nous récupérons le contenu de la requête dans $retour_total
$total=mysql_num_rows($retour_total); //On compte le nombre de lignes.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);

Mais je ne suis pas sur que cela résolve ton problème tu peux nous dire combien tu as d'enregistrement dans ta table et de combien il se trompe pour la pagination?
Quanje fais cela j'ai cette erreur
Citation:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\web\www\search\index.php on line 138
J'ai 11 673 entrée dans ma base j'effectue une recherche avec un nom et ce nom il y en a que 7 dans la base de donnée

c'est bizarre et j'ai essayez plein de pagination et c'est le meme probleme d'affiche de page.

Qu'appelez vous par faire un echo

Je vous remercie de vos reponse
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 22h35   #6
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour,

déja, commence par récupérer le résultat de ta requête comme il le faut.
mysql_fetch_assoc (comme indiqué dans la doc) retourne un tableau de résultat.

donc :

Code :
1
2
3
4
5
 
$nombre_total=0;
if($resultat= mysql_fetch_assoc($retour_total)) {
   $nombre_total= $resultat[0]['total'];
}
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 23h36   #7
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
Code :
1
2
3
4
5
6
7
8
9
10
 
$messagesParPage=2; //Nous allons afficher 5 messages par page.
 
//Une connexion SQL doit être ouverte avant cette ligne...
$retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
cela dit, en divisant un $total=10000 par un $messagesParPage=2, cela donne 5000

ou je me trompe?
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 02h07   #8
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
héhé
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 03h40   #9
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Citation:
Envoyé par ascito Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
 
$messagesParPage=2; //Nous allons afficher 5 messages par page.
 
//Une connexion SQL doit être ouverte avant cette ligne...
$retour_total=mysql_query('SELECT COUNT(*) AS total FROM download'); //Nous récupérons le contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
 
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
cela dit, en divisant un $total=10000 par un $messagesParPage2, cela donne 5000

ou je me trompe?
oui c'est sur. mais c'est un moteur de recherche interne. Donc si je fais une recherche avec un mot precis et qu'en sachant qu'il y a que 7 champs avec ce mots ma recherche donnera 7 messages avec un $messagesParPage=2 me donnera que 3 pages et non 5000 c'est cela qui ne va pas
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 08h25   #10
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Salut

Citation:
Donc si je fais une recherche avec un mot precis et qu'en sachant qu'il y a que 7 champs avec ce mots ma recherche donnera 7 messages
7 champs ? Tu veux dire plutôt 7 lignes non ?
Le nombre de lignes représente le nombre de messages non ?


A mon avis il y a un problème dans la manière dont est conçu ce système de pagination.

Théoriquement, il faut exécuter 2 fois cette même requête (avec les like etc ...).
De ton coté tu récupère tout, sans aucun critère, du coup ce nombre maxi qui est à la base de la pagination est faut (trop de résultats).

Il faudrait théoriquement :
- Une 1ère requête qui elle n'intègrera pas de limite (pas de LIMIT 0, 10 par exemple).
Le but étant de récupérer tout, d'avoir le nombre total de lignes (ou de messages), mais en intégrant les mêmes conditions (ou clauses), la même requête en somme.
Ce sera grâce à ce nombre total où il sera possible de créer la pagination, et de définir les limites dans la 2ème requête.
On pourra obtenir le nombre de page qu'il va avoir et le nombre de message par page.

- Un 2ème requête identique à la différence que cette fois elle intègrera la limite, c'est à dire qu'on récupèrera seulement les messages selon le N° de page qu'on demande et du nombre de ligne voulus.

Ci-dessus est donc un moyen que je dirais "classique" pour faire de la pagination.


Cependant, MySQL intègre cette notion de pagination et offre ceci : SQL_CALC_FOUND_ROWS et FOUND_ROWS(), les 2 vont de paire.
Exemple :
Code :
1
2
3
4
5
SELECT SQL_CALC_FOUND_ROWS, champ1, champ2
FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.id
WHERE t1.condition LIKE '%truc%'
LIMIT 40, 20
Puis on lance une 2ème requête pour récupérer le nombre total
Code :
SELECT FOUND_ROWS() AS total
Ici, les choses sont légèrement différentes par rapport au 1er exemple plus haut.
La 1ère c'est que cela évite de lancer 2 fois la même requête (ce qui normalement devrait être plus performant).
Cependant, quand on lance la 1ère requête, il y a une inconnue, ça concerne le nombre de lignes que doit retourner la requête, c'est à dire le 20 dans le LIMIT.
En mettant 20, on ne sait pas si on va avoir réellement 20 lignes ou moins.
Mais ça n'est pas si gênant que ça.

Grosso modo.
On sait à l'avance le nombre de lignes maximum par page qu'il peu avoir, dans mon exemple c'est 20.
On sait aussi à l'avance la page demandée (par défaut c'est la 1ère, soit LIMIT 0, 20).
Donc lorsqu'on exécute la 1ère requête, et si c'est la 3ème page qui est demandée, alors on mettra : LIMIT 40, 20 (soit récupérer à partir de 40, et récupérer au maxi 20 lignes).
Le résultat de cette 1er requête contiendra alors uniquement les messages voulus.
A l’exécution de la 2ème requête, ceci permettra de créer la pagination car c'est à ce moment qu'on saura le nombre total de messages (sans aucune limite).
(Si on regarde bien, ce fonctionnement est un peu l'inverse du 1er exemple).


Il y a alors 2 manières de faire.
A toi de voir.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 10h27   #11
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour,

Tu peux très bien faire ça en 1 seule requête, bon j'avoue que je ment un peu là... en fait il s'agit de requêtes imbriquées :

Code :
SELECT c.*,t.* FROM (SELECT count(*) as total FROM aide_region) c,aide_region t LIMIT 0,20
C'est plus portable que d'utiliser found_rows(), l'inconvénient est qu'il faut faire une petite contorsion au niveau du code pour récupérer le total...

Bon après, en terme de perf, là je sais pas, faudrait un spécialiste mysql. Je pense néanmoins que cela doit être plus rapide que de faire 2 appels.

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 20h44   #12
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
wahou c'est du chinois tout ça.

Oui je me suis trompé c'est 7 ligne. Mais je me pose une question est-ce que cela viendrais pas de mon script car j'en ai essayé plein de pagination et meme des classe pagination et c'est pareil
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 21h11   #13
Invité régulier
 
Homme
Inscription : avril 2009
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 4
Points : 5
Points : 5
Citation:
Envoyé par RunCodePhp Voir le message
Théoriquement, il faut exécuter 2 fois cette même requête (avec les like etc ...).
De ton coté tu récupère tout, sans aucun critère, du coup ce nombre maxi qui est à la base de la pagination est faut (trop de résultats).

Il faudrait théoriquement :
- Une 1ère requête qui elle n'intègrera pas de limite (pas de LIMIT 0, 10 par exemple).
Le but étant de récupérer tout, d'avoir le nombre total de lignes (ou de messages), mais en intégrant les mêmes conditions (ou clauses), la même requête en somme.
Ce sera grâce à ce nombre total où il sera possible de créer la pagination, et de définir les limites dans la 2ème requête.
On pourra obtenir le nombre de page qu'il va avoir et le nombre de message par page.

- Un 2ème requête identique à la différence que cette fois elle intègrera la limite, c'est à dire qu'on récupèrera seulement les messages selon le N° de page qu'on demande et du nombre de ligne voulus.
Bonsoir,

Tout est indiqué ici McGyver59280.

Ton code ne correspond pas à la logique de la pagination.

Code :
1
2
 
$retour_total=mysql_query('SELECT COUNT(*) AS total FROM download');
Ton code ne prend pas en compte les critères de recherche utilisés par la suite.

Autrement dit, tu as des critères qui font ta requête sql plus bas dans ton code.

Ta requête doit être exécutée DEUX fois :
- une fois sans les limites => pour compter le nombre total de résultats
- une seconde fois par 'tranche', ici 2 résultats à chaque fois.

Relis ton code et les commentaires associés !
Code :
1
2
 
$messagesParPage=2; //Nous allons afficher 5 messages par page.
C'est 2 ou 5 ?

tamplan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 22h24   #14
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
J'ai mis deux pour des test autrement c'est par 5
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 10h35   #15
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Bon je crois que ce script de recherche on ne peux mettre une pagination. Connaissez vous un bon moteur ou une class avec les plusieur option de recherche

Merci a vous pour votre patience
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 11h50   #16
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Citation:
Bon je crois que ce script de recherche on ne peux mettre une pagination. Connaissez vous un bon moteur ou une class avec les plusieur option de recherche
Si, il y a aucune raison de ne pas pourvoir le faire.

Opte pour la 2ème solution que je t'ai mis, c'est beaucoup plus simple que tu le crois.
Il juste procéder dans l'ordre.

1/ On défini une variable qui contiendra le nombre maximum de ligne par page
Code :
$nb_lignemax_page = 20;
Puis on défini le N° de page en court (ou demandée) :
Code :
1
2
$page_courante = 1;
if (isset($_GET['page_courante']) && (int)$_GET['page_courante'] > 1) $page_courante = (int)$_GET['page_courante'];
A ce stade on déjà définir le LIMIT qui est à la source de la pagination.
Si la page demandée est la 3, alors : 3 x 20 = 60 (ça récupèrera à partir de cette ligne).
Ca donne :
Code :
$limit_debut = $page_courante * $nb_lignemax_page;
Donc on peu lancer la 1ère requête. Exemple :
Code :
1
2
3
4
5
6
$sql = "
SELECT SQL_CALC_FOUND_ROWS, champ1, champ2
FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.id
WHERE t1.condition LIKE '%truc%'
LIMIT ".(int)$limit_debut.", 20";
Cette requête contiendra uniquement les données de la page demandée. il y aura au maximum 20 résultats (20 lignes/20messages).
Mais c'est un nombre maxi. Bien souvent il y a moins pour la dernière page.


Et dans la foulée on lance la 2ème :
Code :
$sql = 'SELECT FOUND_ROWS() AS total_reel';
Avec cette requête on obtiendra le nombre total réel.
C'est avec celle ci qu'on pourra construire la pagination, c'est à dire la 1ère, les pages suivantes jusqu'à la dernière.
Suffit des faire les divisions et compagnie (ceil, etc ...).
Mais ça tu l'a déjà fais, donc suffit de le reprendre.

Ou est le problème ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 12h36   #17
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Le soucis est que je suis assez limité en connaissance php
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 14h45   #18
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
C'est pourtant simple...

-tu as configuré 2 messages par page
-tu fais une requête sans aucun critère de filtre, tu obtiens environ 10000 résultats. (nous l'appellerons requête1)
-tu fais une requête avec les critères de filtre, tu obtiens 7 résultats (nous l'appellerons requête2 )

si tu divises le nombre de résultat obtenu par requête2 par le nombre de message par page :
7 / 2 = 3,5 (pas pratique donc on utilise la méthode ceil() qui va nous arrondir la division au supérieur ce qui nous donne : 4 , on l'appellera nbpages)

maintenant :

-je veux afficher :
"nombre de résultat / nombre total" alors :
nb résultats requête2 / nb résultats requête1

-je veux afficher
"page courante / nombre de pages" alors :
$page_actuelle / nbpages

Voilà, c'est tout... actuellement tu obtiens 5000 pages, parce que tu t'entêtes à vouloir diviser le nombre total de lignes dans ta table (10000) par le nombre de message par page (2)...

Ceci étant dit, tu récupères un script de pagination qui ne peut pas faire de pagination...
Tu sollicite notre aide pour comprendre ton travail, on t'explique, et au final c'est trop compliqué, tu cherches maintenant un autre script....

Je suis désolé de t'apprendre que tu auras sans aucun doute tout autant de problèmes avec un autre script... ce n'est pas le script qui ne fonctionne pas, c'est toi qui ne le comprends pas.

Je ne veux pas te décourager, mais bon... ou tu fais un effort pour essayer de comprendre ce que les autres prennent du temps à t'écrire, ou tu cherches de la compétence autour de toi pour te le faire...

Sinon pour trouver d'autres scripts, google en est gavé, tu trouveras facilement...

J'espère que tu ne le prends pas mal et bonne continuation !...
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 10h57   #19
Invité de passage
 
Inscription : juin 2009
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 16
Points : 0
Points : 0
Non je le prend pas mal. Tu as raison c'est en perseverant que l'on comprend.

Je vais revoir mon script et faire etape par etape en suivant vos indications

Je te remercie de ta patience
McGyver59280 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h38.


 
 
 
 
Partenaires

Hébergement Web