Formulaire multi critères + pagination

nauterie - 12 sept. 2012 à 07:50
 nauterie - 16 sept. 2012 à 06:44
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']; ?> &#8364; 
 


Prix du Fonds de C: <?php echo $donnees['prix']; ?> &#8364;


 <?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).'&amp;';

        $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.'&amp;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;
}


?>

3 réponses

cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
14 sept. 2012 à 07:55
bonjour

}  //????????????????
include('../inc_connect.php');

if(isset($_REQUEST['recherche']))
{
  $_SESSION['$recherche'] = $_REQUEST['recherche'] ;
  if ( isset( $_SESSION['$recherche'] ) )
   echo $_SESSION['$recherche'] ;
}



je commencerai plutôt comme ça

session_start();

if(isset($_REQUEST['recherche']) && !empty($_REQUEST['recherche'])){
$_SESSION['$recherche'] = $_REQUEST['recherche'] ;
include('../inc_connect.php');
}else{
$_SESSION['$recherche']=null;
}


Bonne programmation !
0
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']; ?> &#8364; 
 


Prix du Fonds de C: <?php echo $donnees['prix']; ?> &#8364;


 <?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).'&amp;';

        $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.'&amp;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;
}


?>
0
Bonjour, FIN de la galère, la pagination marche très bien ....

MERCI pour votre aide

Le code final
<?php
session_start();
?>

<?php
                 $host =  "localhost";
                 $user = "root";
                 $pass = "";
                 $bdd = "XXXXXX";
                                 
                         $cnx = mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
                         $db = @mysql_select_db("$bdd") or die("Impossible de se connecter");
                                 if (mysql_connect ($host,$user,$pass)) 

$limit  = 4;
$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($_REQUEST['code_commerce']) && strlen($_REQUEST['code_commerce'])) {
   $where[] = "code_commerce = '".mysql_real_escape_string($_REQUEST['code_commerce'])."'";
}
 
if (isset($_REQUEST['departement']) && strlen($_REQUEST['departement'])) {
   $where[] = "departement = '".mysql_real_escape_string($_REQUEST['departement'])."'";
}

if (isset($_REQUEST['ref']) && strlen($_REQUEST['ref'])) {
   $where[] = "ref = '".mysql_real_escape_string($_REQUEST['ref'])."'";
}

$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 
    
              
                {

                         $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']; ?> &#8364; 
 


Prix du Fonds de C: <?php echo $donnees['prix']; ?> &#8364;


 <?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){
$preserved_params = array('code_commerce'=>mysql_real_escape_string($_GET['code_commerce']), 'departement'=>mysql_real_escape_string($_GET['departement']) );


  $query = '';
  $str_hidden = '';

  if (is_array($preserved_params)) {
    foreach ($preserved_params as $k=>$v) {
      if ($k != 'offset') {
        $query .= $k.'='.urlencode($v).'&amp;';

        $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.'&amp;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;
}
?>


0
Rejoignez-nous