Pagination selon résultat moteur de recherche

Résolu/Fermé
soleil44 - 28 déc. 2010 à 14:30
 randoudou - 7 mai 2013 à 14:10
Bonjour,

Voilà j'ai un problème j'espère que quelqu'un pourra m'aider! j'ai fait un moteur de recherche interne par mot clé qui fonctionne très bien, mais j'aimerais que les résultats s'affichent avec un système de pagination automatique.
J'ai réussi à faire un système de pagination à part avec une requête toute prête mais comment "mélanger" les deux pour que le nombre de pages s'adapte au résultat de la recherche?
Voici mes deux codes:


<html>
<form method="POST" action="222.php"> 
Rechercher un mot : <input type="text" name="recherche">
<input type="SUBMIT" value="recherche"> 
</form>
</html> 



<?php include("connectionbdd2.php"); 

// Récupère la variable
$recherche = isset($_POST['recherche']) ? $_POST['recherche'] : '';
// la requete mysql
$sql = mysql_query("SELECT nom, adresse, localite, id FROM liste_salons WHERE nom LIKE '%$recherche%'" .
"  OR localite LIKE '%$recherche%'" . " OR adresse LIKE '%$recherche%'") or die (mysql_error());

// affichage du résultat
while(list($nom, $adresse, $localite)=mysql_fetch_array($sql))

{
echo ''.$nom.', '.$adresse.' à '.$localite.' <br />';

}


?>


et celui de la pagination:


<?php include("connectionbdd2.php"); 

$messagesParPage=5; //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 liste_salons WHERE localite="prilly"'); //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

// La requête sql pour récupérer les messages de la page actuelle.
$retour_messages=mysql_query('SELECT nom, adresse, id, localite FROM liste_salons WHERE localite="prilly" ORDER BY id DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');

while($donnees_messages=mysql_fetch_assoc($retour_messages)) // On lit les entrées une à une grâce à une boucle
{
     //Je vais afficher les messages dans des petits tableaux. C'est à vous d'adapter pour votre design...
     //De plus j'ajoute aussi un nl2br pour prendre en compte les sauts à la ligne dans le message.
	     echo '
        <strong>'.stripslashes($donnees_messages['nom']).'</strong><br>
                '.nl2br(stripslashes($donnees_messages['adresse'])).'<br>
                '.nl2br(stripslashes($donnees_messages['localite'])).'<br><br>
				
             ';
		
			

	 
	 
    //J'ai rajouté des sauts à la ligne pour espacer les messages.   
}

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="111.php?page='.$i.'">'.$i.'</a> ';
     }
}
echo '</p>';


merci d'avance pour vos solutions!

14 réponses

jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 14:33
Souhaites-tu une pagination normal ou une pagination en Ajax ?
0
en php si possible, normale.

merci :-)
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 14:50
Que ca soit en normal ou en Ajax ca reste du PHP, juste que l'appel de la fonction pagination se fera en Javascript.
On reste donc sur du PHP pur sans javascript?
0
oui si possible car je ne connais pas du tout le javascript
0

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

Posez votre question
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 15:22
En fait, je suis en train de voir que ta fonction pagination est déjà complète... Tu as tout ce qu'il faut sous la main.
0
oui c'est ça le pire mais lorsque j'intègre la requête du moteur de recherche ça ne fonctionne pas. J'ai un message d'erreur qui me dit que la division est à zéro... ce qui peut paraître normal étant donné qu'il faut insérer qqch dans le formulaire... je ne sais plus comment faire :-(
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 15:39
Si tu attends un peu, je te donne une fonction pagination toute faite avec ta fonction dedans, tu auras juste a copier/coller. C'est mon jour de bonté :D
0
alors c'est même bien plus que ce que j'attendais à vrai dire!
ou juste un indice me suffirait aussi :-)
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 15:53
function paginate($url, $param, $total, $current, $adj=3)
{
	/* Déclaration des variables */
	$prev = $current - 1; // numéro de la page précédente
	$next = $current + 1; // numéro de la page suivante
	$n2l = $total - 1; // numéro de l'avant-dernière page (n2l = next to last)

	/* Initialisation : s'il n'y a pas au moins deux pages, l'affichage reste vide */
	$pagination = '';

	/* Sinon ... */
	if ($total > 1){
		/* Concaténation du <div> d'ouverture à $pagination */
		$pagination .= "<div class=\"pagination\">\n";

		/* ////////// Début affichage du bouton [précédent] ////////// */
		if ($current == 2) // la page courante est la 2, le bouton renvoit donc sur la page 1, remarquez qu'il est inutile de mettre ?p=1
			$pagination .= " <a href=\"{$url}\">Précédent</a> ";
		elseif ($current > 2) // la page courante est supérieure à 2, le bouton renvoit sur la page dont le numéro est immédiatement inférieur
			$pagination .= " <a href=\"{$url}{$param}{$prev}\">Précédent</a> ";
		else // dans tous les autres, cas la page est 1 : désactivation du bouton [précédent]
			$pagination .= "<span class=\"inactive\"> Précédent </span>";
		/* Fin affichage du bouton [précédent] */

		/* ///////////////
		Début affichage des pages, l'exemple reprend le cas de 3 numéros de pages adjacents (par défaut) de chaque côté du numéro courant
		- CAS 1 : il y a au plus 12 pages, insuffisant pour faire une troncature
		- CAS 2 : il y a au moins 13 pages, on effectue la troncature pour afficher 11 numéros de pages au total
		/////////////// */

		/* CAS 1 */
		if ($total < 7 + ($adj * 2)){
			/* Ajout de la page 1 : on la traite en dehors de la boucle pour n'avoir que index.php au lieu de index.php?p=1 et ainsi éviter le duplicate content */
			$pagination .= ($current == 1) ? '<span class="active">1</span>' : "<a href=\"{$url}\">1</a>"; // Opérateur ternaire : (condition) ? 'valeur si vrai' : 'valeur si fausse'

			/* Pour les pages restantes on utilise une boucle for */
			for ($i = 2; $i<=$total; $i++){
				if ($i == $current) // Le numéro de la page courante est mis en évidence (cf fichier CSS)
				$pagination .= "<span class=\"active\"> {$i} </span>";
				else // Les autres sont affichés normalement
				$pagination .= " <a href=\"{$url}{$param}{$i}\">{$i}</a> ";
			}
		}

		/* CAS 2 : au moins 13 pages, troncature */
		else{
			/*
			Troncature 1 : on se situe dans la partie proche des premières pages, on tronque donc la fin de la pagination.
			l'affichage sera de neuf numéros de pages à gauche ... deux à droite (cf figure 1)
			*/
			if ($current < 2 + ($adj * 2)){
				/* Affichage du numéro de page 1 */
				$pagination .= ($current == 1) ? "<span class=\"active\"> 1 </span>" : " <a href=\"{$url}\">1</a> ";

				/* puis des huit autres suivants */
				for ($i = 2; $i < 4 + ($adj * 2); $i++){
				if ($i == $current)
					$pagination .= "<span class=\"active\"> {$i} </span>";
					else
					$pagination .= " <a href=\"{$url}{$param}{$i}\">{$i}</a> ";
				}

				/* ... pour marquer la troncature */
				$pagination .= ' ... ';

				/* et enfin les deux derniers numéros */
				$pagination .= " <a href=\"{$url}{$param}{$n2l}\">{$n2l}</a> ";
				$pagination .= " <a href=\"{$url}{$param}{$total}\">{$total}</a> ";
			}

			/*
			Troncature 2 : on se situe dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
			l'affichage sera deux numéros de pages à gauche ... sept au centre ... deux à droite (cf figure 2)
			*/
			elseif ( (($adj * 2) + 1 < $current) && ($current < $total - ($adj * 2)) ){
				/* Affichage des numéros 1 et 2 */
				$pagination .= " <a href=\"{$url}\">1</a> ";
				$pagination .= " <a href=\"{$url}{$param}2\">2</a> ";

				$pagination .= ' ... ';

				/* les septs du milieu : les trois précédents la page courante, la page courante, puis les trois lui succédant */
				for ($i = $current - $adj; $i <= $current + $adj; $i++){
					if ($i == $current)
					$pagination .= "<span class=\"active\"> {$i} </span>";
					else
					$pagination .= " <a href=\"{$url}{$param}{$i}\">{$i}</a> ";
				}

				$pagination .= ' ... ';

				/* et les deux derniers numéros */
				$pagination .= " <a href=\"{$url}{$param}{$n2l}\">{$n2l}</a> ";
				$pagination .= " <a href=\"{$url}{$param}{$total}\">{$total}</a> ";
			}

			/*
			Troncature 3 : on se situe dans la partie de droite, on tronque donc le début de la pagination.
			l'affichage sera deux numéros de pages à gauche ... neuf à droite (cf figure 3)
			*/
			else{
				/* Affichage des numéros 1 et 2 */
				$pagination .= " <a href=\"{$url}\">1</a> ";
				$pagination .= " <a href=\"{$url}{$param}2\">2</a> ";

				$pagination .= ' ... ';

				/* puis des neufs dernières */
				for ($i = $total - (2 + ($adj * 2)); $i <= $total; $i++){
					if ($i == $current)
						$pagination .= "<span class=\"active\"> {$i} </span>";
					else
						$pagination .= " <a href=\"{$url}{$param}{$i}\">{$i}</a> ";
				}
			}
		}
		/* Fin affichage des pages */

		/* ////////// Début affichage du bouton [suivant] ////////// */
		if ($current == $total)
			$pagination .= "<span class=\"inactive\"> Suivant </span>\n";
		else
			$pagination .= " <a href=\"{$url}{$param}{$next}\">Suivant</a> \n";
		/* Fin affichage du bouton [suivant] */

		/* </div> de fermeture */
		$pagination .= "</div>\n";
	}

	/* Fin de la fonction, renvoi de $pagination au programme */
	return ($pagination);
}
	
?>
<html>
<form method="POST" action="#"> 
Rechercher un mot : <input type="text" name="recherche">
<input type="SUBMIT" value="recherche"> 
</form>
</html>

    <?php

	/* Calcul du nombre total d'entrées $total dans la table posts */
	$res = mysql_query("SELECT COUNT(*) AS nbr FROM liste_salons WHERE nom LIKE '%$recherche%'");
	$row = mysql_fetch_row($res);
	$total = $row[0];
	
	/* Libération du résultat */
	mysql_free_result($res);
	
	/* Déclaration des variables */
	$epp = 5; // nombre d'entrées à afficher par page (entries per page)
	$countp = ceil($total/$epp); // calcul du nombre de pages $countp (on arrondit à l'entier supérieur avec la fonction ceil() )
	
	/* Récupération du numéro de la page courante depuis l'URL avec la méthode GET */
	if(!isset($_GET['p']) || !is_numeric($_GET['p']) ) // si $_GET['p'] n'existe pas OU $_GET['p'] n'est pas un nombre (petite sécurité supplémentaire)
		$current = 1; // la page courante devient 1
	else
	{
		$page = intval($_GET['p']); // stockage de la valeur entière uniquement
		if ($page < 1) $current=1; // cas où le numéro de page est inférieure 1 : on affecte 1 à la page courante
		elseif ($page > $countp) $current=$countp; //cas où le numéro de page est supérieur au nombre total de pages : on affecte le numéro de la dernière page à la page courante
		else $current=$page; // sinon la page courante est bien celle indiquée dans l'URL
	}
	
	/* $start est la valeur de départ du LIMIT dans notre requête SQL (est fonction de la page courante) */
	$start = ($current * $epp - $epp);
	?>
    // Récupère la variable
$recherche = isset($_POST['recherche']) ? $_POST['recherche'] : '';
// la requete mysql
$sql = mysql_query("SELECT nom, adresse, localite, id FROM liste_salons WHERE nom LIKE '%$recherche%' LIMIT $start, $epp" .
"  OR localite LIKE '%$recherche%'" . " OR adresse LIKE '%$recherche%'") or die (mysql_error());

// affichage du résultat
while(list($nom, $adresse, $localite)=mysql_fetch_array($sql))

{
echo ''.$nom.', '.$adresse.' à '.$localite.' <br />';

}

	
<?php
	/* Appel de la fonction */
	echo paginate('index.php?page=compteur', '&p=', $countp, $current);
	?>
	</div>
    </div>
</div>
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 15:54
Toute la fonction paginate() n'est pas as modifier. Normalement cela devrait marcher. Mais si ce n'est pas le cas, la structure est correcte.
0
merci c'est super, par contre je n'ai plus qu'un seul message d'erreur:

Notice: Undefined variable: recherche in C:\wamp\www\test\forumsolution.php on line 146
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OR localite LIKE '%ada%' OR adresse LIKE '%ada%'' at line 1

La ligne 146 est celle-ci:
$res = mysql_query("SELECT COUNT(*) AS nbr FROM liste_salons WHERE nom LIKE '%$recherche%'");


j'avais aussi eu ce souci avant, et je ne comprends pas pourquoi ça ne fonctionne pas!
0
oui c'est tout bon j'ai réussi!
mille merci pour ton aide!
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 16:15
Pour le SELECT essaye ca :
"SELECT nom, adresse, localite, id FROM liste_salons WHERE nom LIKE '%$recherche%' OR localite LIKE '%$recherche%' OR adresse LIKE '%$recherche%' LIMIT $start, $epp"
0
jypyx Messages postés 679 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 28 novembre 2012 107
28 déc. 2010 à 17:26
Pas de problème, heureux d'avoir rendu service :D
0
Bonjour, cette fonction pourra me sauver la vie! ça serait possible d'avoir des details sur les paramètres à donner pour la fonction paginate?
merci.
0