Bonjour, depuis quelques semaines je bataille pour paginer les résultats issus d'une BDD mysql. Mon site est en PHP et traite des fonds de commerce à vendre dans le sud-ouest. J'ai créé deux formulaires qui traitent, l'un une recherche par "mots clés", l'autre par 2 listes déroulantes (code_commerce, département).
Avec le formulaire "mots clés" la pagination marche très bien avec les variables de session.
Avec le formulaire "critères multiples" le je bloque à la page 2 et je n'ai pas découvert de solution dans les différents forum. A première vue mes deux valeurs ne $_SESSION['$recherche']sont pas sauvegardées. Je ne dois pas savoir paramétrer et déclarer $_SESSION['$code_commerce'] et $_SESSION['$departement'].
Un petit coup de main me srait très utile ....
MERCI
<?php
session_start();
}
include('../inc_connect.php');
if(isset($_REQUEST['recherche']))
{
$_SESSION['$recherche'] = $_REQUEST['recherche'] ;
if ( isset( $_SESSION['$recherche'] ) )
echo $_SESSION['$recherche'] ;
}
$limit = 5;
$offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
// on récupère les critères sélectionnés
extract ($_REQUEST);
$i = 0;
// si la variable est présente, on lui affecte une place dans le tableau 'choix[]', qui nous servira ensuite à construire le WHERE de la requête.
if(!empty($code_commerce)) { $choix[$i++] = "code_commerce = '$code_commerce'"; }
if(!empty($departement)) { $choix[$i++] = "departement = '$departement'"; }
if(!empty($ref)) { $choix[$i++] = "ref = '$ref'"; }
// on insère les éléments remplis dans une variable $critere, en commençant par la première occurrence, puis on boucle
$critere = @$choix[0]." ";
for($j=1;$j<$i;$j++)
{
$critere .= " AND ".$choix[$j]." ";
}
// enfin on fait la requête si $i >0, ça veut dire qu'il y a des critères
if($i > 0)
{
// requete de selection
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM tous_commerces2 WHERE $critere ORDER BY ref desc";
$sql .= ' LIMIT '.$offset.', '.$limit.'';
$requete = @mysql_query( $sql, $cnx ) or die( "ERREUR MYSQL numéro: ".mysql_errno()."
Type de cette erreur: ".mysql_error()."
\n" );
}
$i = @mysql_num_rows($requete); //comptage du nombre d'entrées sélectionnées par la recherche
if ($i == 0) //s'il n'y a pas de résultat
{
echo 'Pas de résultat ....
1 - Faites votre choix dans le type de commerce
2 - choisissez un département limitrophe
3 - cette référence peut ne plus exister (commerce vendu)';
}
else
{
echo 'Nombre de résultats: ' . $i . '
'; //nombre de résultats
$sql = "SELECT * FROM tous_commerces2 ORDER BY ref desc";
}
while ($donnees = @mysql_fetch_assoc( $requete ) )
{
?>
<tr>
<fieldset class="arrondi" style="border:2px solid #CCCCCC; font-family:verdana; color:#000000; background-color:#FFFFFF; margin-bottom: 5px">
Ref: <?php echo $donnees['ref']; ?>
Prix des murs: <?php echo $donnees['prix_murs']; ?> €
Prix du Fonds de C: <?php echo $donnees['prix']; ?> €<?php echo $donnees['commerce']; ?>
Descriptif: <?php echo $donnees['descriptif']; ?>
[# " width ="500" height="400">]
[../Dossier_pages/selection.php?recherche=<?php echo $donnees['ref']; ?> ]
" width="55" height="35">
</fieldset>
</tr>
<?php
}
$requete = mysql_query('SELECT FOUND_ROWS() AS total');
$donnees = mysql_fetch_assoc($requete);
echo paging('../Dossier_pages/recherche2.php', $donnees['total'], $limit, $offset);
function paging($page, $total_rows, $limit, $offset, $preserved_params = null){
$query = '';
$str_hidden = '';
if (is_array($preserved_params)) {
foreach ($preserved_params as $k=>$v) {
if ($k != 'offset') {
$query .= $k.'='.urlencode($v).'&';
$str_hidden .= '';
}
}
}
if (strpos($page, '?') !== false) {
$page = substr($page, 0, strpos($page, '?'));
}
$nb_pages = ceil($total_rows / $limit);
$i = 0;
$j = 0;
$idx_page = 0;
while ($i < $total_rows) {
$tab_pages[$j]['id'] = $i;
$tab_pages[$j]['text'] = ($j + 1).' / '.$nb_pages;
if ((int)$offset >= $i) {
$idx_page = $j;
}
$i += $limit;
$j++;
}
$reponse = ' <form class="barre-navigation-pages" action="'.$page.'">';
$page .= '?'.$query;
if ($offset > 0)
{$reponse .= '['.$page.'&offset='.($offset - $limit).' Précédant] ';}
$reponse .= 'Page <select name="offset">';
for ($i = 0; $i < $nb_pages; $i++) {
$reponse .= '<option value="'.$tab_pages[$i]['id'].'" ';
if ($i == $idx_page) {
$reponse .= 'selected="selected"';
}
$reponse .= '>'.$tab_pages[$i]['text'].'</option>';
}
$reponse .= '</select>'.$str_hidden.'';
if ($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) {
$reponse .= ' ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]';
}
$reponse .= '</form>
';
return $reponse;
}
?>
Bonjour, merci de vous être intéressé à ma galère.
J'ai modifié mon code :
1- en tenant compte de vos recommandations
2- en changeant ma requete sql.
Les résultats:
1- La première page c'est parfait, la sélection est bonne ainsi que les parêtres dans LIMIT
2- La deuxième page n'est plus vide, mais elle sélectionne la totalité de ma table (LIMIT est OK).
J'ai toujours ce problème de conservation des sélections du formulaire en page 2
Voilà le nouveau code
<?php
session_start();
include('../inc_connect.php');
if(isset($_REQUEST['recherche']) && !empty($_REQUEST['recherche'])){
$_SESSION['$recherche'] = $_REQUEST['recherche'] ;
include('../inc_connect.php');
}else{
$_SESSION['$recherche']=null;
}
$limit = 5;
$offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
$sql_limit = "LIMIT $offset, $limit";
$where = array();
// j'ai considéré que tous ces champs étaient des varchar dans ta base de données
if (isset($_POST['code_commerce']) && strlen($_POST['code_commerce'])) {
$where[] = "code_commerce = '".mysql_real_escape_string($_POST['code_commerce'])."'";
}
if (isset($_POST['departement']) && strlen($_POST['departement'])) {
$where[] = "departement = '".mysql_real_escape_string($_POST['departement'])."'";
}
$sql_Where = (empty($where)) ? null : 'WHERE '.implode(' AND ', $where);
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM tous_commerces2 $sql_Where $sql_limit";
$requete = mysql_query($sql, $cnx) or die( "ERREUR MYSQL numéro: ".mysql_errno()."
Type de cette erreur: ".mysql_error()."
\n" );
$i = @mysql_num_rows($requete); //comptage du nombre d'entrées sélectionnées par la recherche
if ($i == 0) //s'il n'y a pas de résultat
{
echo 'Pas de résultat ....
1 - Faites votre choix dans le type de commerce
2 - choisissez un département limitrophe
3 - cette référence peut ne plus exister (commerce vendu)';
}
else
{
echo 'Nombre de résultats: ' . $i . '
'; //nombre de résultats
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM tous_commerces2 ORDER BY ref desc";
}
while ($donnees = @mysql_fetch_assoc( $requete ) )
{
?>
<tr>
<fieldset class="arrondi" style="border:2px solid #CCCCCC; font-family:verdana; color:#000000; background-color:#FFFFFF; margin-bottom: 5px">
Ref: <?php echo $donnees['ref']; ?>
Prix des murs: <?php echo $donnees['prix_murs']; ?> €
Prix du Fonds de C: <?php echo $donnees['prix']; ?> €<?php echo $donnees['commerce']; ?>
Descriptif: <?php echo $donnees['descriptif']; ?>
[# " width ="500" height="400">]
[../Dossier_pages/selection.php?recherche=<?php echo $donnees['ref']; ?> ]
" width="55" height="35">
</fieldset>
</tr>
<?php
}
$requete = mysql_query('SELECT FOUND_ROWS() AS total');
$donnees = mysql_fetch_assoc($requete);
echo paging('../Dossier_pages/recherche8.php', $donnees['total'], $limit, $offset);
function paging($page, $total_rows, $limit, $offset, $preserved_params = null){
$query = '';
$str_hidden = '';
if (is_array($preserved_params)) {
foreach ($preserved_params as $k=>$v) {
if ($k != 'offset') {
$query .= $k.'='.urlencode($v).'&';
$str_hidden .= '';
}
}
}
if (strpos($page, '?') !== false) {
$page = substr($page, 0, strpos($page, '?'));
}
$nb_pages = ceil($total_rows / $limit);
$i = 0;
$j = 0;
$idx_page = 0;
while ($i < $total_rows) {
$tab_pages[$j]['id'] = $i;
$tab_pages[$j]['text'] = ($j + 1).' / '.$nb_pages;
if ((int)$offset >= $i) {
$idx_page = $j;
}
$i += $limit;
$j++;
}
$reponse = ' <form class="barre-navigation-pages" action="'.$page.'">';
$page .= '?'.$query;
if ($offset > 0)
{$reponse .= '['.$page.'&offset='.($offset - $limit).' Précédant] ';}
$reponse .= 'Page <select name="offset">';
for ($i = 0; $i < $nb_pages; $i++) {
$reponse .= '<option value="'.$tab_pages[$i]['id'].'" ';
if ($i == $idx_page) {
$reponse .= 'selected="selected"';
}
$reponse .= '>'.$tab_pages[$i]['text'].'</option>';
}
$reponse .= '</select>'.$str_hidden.'';
if ($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) {
$reponse .= ' ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]';
}
$reponse .= '</form>
';
return $reponse;
}
?>