IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Recherche avec pagination


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    Points : 46
    Points
    46
    Par défaut Recherche avec pagination
    Bonjour,

    J'ai une function recherche avec pagination. Le résultat affiche bien sur la première page, mais par contre a deuxième page n'affiche rien. Qu'est-ce que je devrais modifier?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php 
     
    include("includes/config.php"); 
     
    function resultat_recherche($search){
     
    $ou="";
    $search = preg_split('/[\s]+/',$search);
     
    $total_resultat = count($search);
     
    foreach($search as $key=>$searches){
    $ou .="nomrecette LIKE '%$searches%'";
    	if($key !=($total_resultat-1)){
    		$ou .=" AND ";
    	}
      }
     
     
    $sql = "SELECT COUNT(id_recettes) AS nb_recettes FROM recettes WHERE $ou";
    $requete = mysql_query($sql) or die( "ERREUR MYSQL numéro: ".mysql_errno()."<br>Type de cette erreur: ".mysql_error()."<br>\n" );
    $result = mysql_fetch_array($requete);
     
    $nb_recettes = $result['nb_recettes'];
    $perPage = 1;
    $nb_Page = ceil($nb_recettes/$perPage);
     
    if(isset($_GET['p']) && $_GET['p']>0 && $_GET['p']<=$nb_Page){
    	$cPage = $_GET['p'];
    }else{
    	$cPage = 1;
    }
     
     
      $query=mysql_query("SELECT * FROM recettes WHERE $ou ORDER BY id_recettes LIMIT ".(($cPage-1)*$perPage).",$perPage");
      $rows=mysql_num_rows($query);
     
     
      if($rows){
     
      	while($row = mysql_fetch_assoc($query)){
    	echo $row['nomrecette']."<br/><strong>".$row['preparation']."</strong><br />";
    	}
      }else echo "Pas de resultat pour votre recherche ".$searches;
     
    for($i=1;$i<=$nb_Page;$i++){
    	if($i==$cPage){
    		echo " $i ";
    	}else{
    		echo "<a href=\"search.php?p=$i\">$i</a>";
    		}
    }}
    ?>

  2. #2
    Membre averti
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Points : 374
    Points
    374
    Par défaut
    bonjour,
    tu peux déjà faire un echo de ta requête sql pour voir ce que tu envoies
    et tu peux montrer la page search.php stp ? j'ai un doute : quand tu mets les liens pour les autres pages, tu passe en paramètre uniquement le numéro de la page mais pas la recherche

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Merci pour la réponse! Voici ma page search.php.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php include("includes/haut.php"); ?> 
    	<div class="center_content">
    		<?php include("includes/menu.php"); ?> 
    			<div class="center2_content">
    			<?php include("includes/config.php"); 
    				  include("includes/function.php");
    			?>
    			<h3>Recherche par mot-clé: </h3>
    				<form action="search.php" method="post">
    				<strong>Votre recherche:</strong><br />
    				<input type="text" name="search"><br /><br />
    				<input type="submit" value="chercher" name="submit">
     
    				</form>
    <?php
    if(isset($_POST['submit'])){
    	$search=mysql_real_escape_string(htmlentities(trim($_POST['search'])));
    	if(empty($search))
    	{
    	$error[]="Veuillez saisir un mot-clé.";
    	}else if(strlen($search)<2){
    	$error[]="Veuillez saisir un mot-clé qui dépasse les 2 caractères.";	
    	}
    	if(empty($error)){
    	resultat_recherche($search);
     
    	}else{
     
    	foreach($error as $errors){ echo $errors."<br/>";}
    	}
    }
     
    ?>
    			</div><!--end of center2 content-->
    		<div class="clear"></div>
    	<div class="clear"></div>
    </div><!--end of center content-->
    <?php include("includes/bas.php"); ?>

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    j'ai repris ton premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
     
    include 'includes/config.php';
     
    function resultat_recherche($search)
    {
        $where = array();
        $words = explode(' ', $search);
     
        foreach($words as $word)
        {
            if ($word !== '')
            {
                $where[] = "nomrecette LIKE '%".mysql_real_escape_string($word)."%'";
            }
        }
     
        $sql_where = (empty($where)) ? '' : 'WHERE '.implode(' AND ', $where);
     
        $sql     = "SELECT COUNT(id_recettes) AS nb_rows FROM recettes {$sql_where}";
        $qry     = mysql_query($sql) or die( 'ERREUR MYSQL numéro: '.mysql_errno().'<br />Type de cette erreur: '.mysql_error()."<br />\n");
        $nb_rows = mysql_result($qry, 0);
     
        $nb_rows_pp = 1;   // nb rows per page = 1 !! (t'es sûr ?)
        $nb_pages   = ceil($nb_rows/$nb_rows_pp);
     
        $current_page = 1;
        if (( ! empty($_GET['p'])) && is_numeric($_GET['p']) && ((int)$_GET['p'] <= $nb_pages))
        {
            $current_page = (int)$_GET['p'];
        }
     
        if ($nb_rows)
        {
            $start = ($current_page - 1) * $nb_rows_pp;
            $sql   = "SELECT * FROM recettes {$sql_where} ORDER BY id_recettes LIMIT {$start},{$nb_rows_pp}";
            $qry   = mysql_query($sql) or die( 'ERREUR MYSQL numéro: '.mysql_errno().'<br />Type de cette erreur: '.mysql_error()."<br />\n");
     
            while ($row = mysql_fetch_assoc($qry))
            {
                echo htmlentities($row['nomrecette']).'<br /><strong>'.htmlentities($row['preparation']).'</strong><br />';
            }
        }
        else
        {
            echo 'Pas de resultat pour votre recherche '.htmlentities($search);
        }
     
        // pagination
        for ($i = 1 ; $i <= $nb_pages ; ++$i)
        {
            echo ($i === $current_page)
                     ? $i
                     : '<a href="search.php?p='.$i.'">'.$i.'</a>';
        }
    }
    ?>
    ensuite pour ta problématique de pagination dans des résultats de recherche c'est plus complexe que ça :
    il faut que tu conserves le texte de recherche entre les appels pour que ta pagination soit cohérente
    - soit tu utilises les sessions
    - soit en plus du numéro de page sélectionné, tu re-soumets la valeur du texte à chaque clic et dans ce cas, il va falloir faire appel à du javascript
    - soit tu verrouilles la zone de texte dès qu'une recherche a commencé et tu mets un bouton pour la déverrouiller ainsi tu pourras coder en dur dans le lien d'appel le texte de recherche : quelque chose comme ça : search.php?p=num_page&q=texte_recherché

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    Points : 46
    Points
    46
    Par défaut
    Merci! Je voudrais bien faire avec des sessions. Comme dans mon formulaire mon champ s'appelle search, il faut que j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['search'] = $_POST['search'];
    ? Mais après... Est-ce que tu pourrais m'expliquer un petit peu comment faire? Merci d'avance!

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Voilà un peu de lecture sur les sessions.
    Pour résumer la session est un mécanisme qui met à ta disposition un tableau superglobal te permettant de stocker des données spécifiques à chaque client.
    Il suffit de démarrer les scripts avec un session_start() pour avoir accès au tableau $_SESSION.
    D'autres ressources très utiles : ici

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Par contre les sessions ça risque d'être un peu galère si un même client ouvre plusieurs fois la page...
    Pourquoi tu n'encode pas directement le num_page dans ton lien ou fiens un champs type hidden comme dit plus haut ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    Points : 46
    Points
    46
    Par défaut
    Merci! En fait, je n'ai pas compris comment je pourrais faire avec le champ hidden. Tu pourrais me donner quelques pistes?

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    dans ton formulaire tu auras 2 inputs
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="text" name="search" value="" />
    <input type="hidden" name="last_search" value="" />
    Voici comment faire :
    - au premier appel : tu affiches juste le formulaire de recherche
    - ensuite à la soumission ou clic sur un numéro de page : tu compares les valeurs des champs : $_POST['search'] avec $_POST['last_search'],
    • si elles diffèrent : tu commences une nouvelle recherche -> afficher la page 1 des résultats et faire <input type="hidden" name="last_search" value="{$_POST['search']}" />
    • si identiques -> afficher la page demandée

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/02/2015, 12h21
  2. Réponses: 0
    Dernier message: 01/07/2014, 13h53
  3. recherche avec findnearest
    Par souad26 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/11/2004, 20h58
  4. Enlever la surbrillance lors d'une recherche avec vi
    Par sekiryou dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 04/03/2004, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo