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 confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    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 expérimenté
    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 : 30
    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 éclairé

    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 115
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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