Bonjour,

Ca fait plusieurs jours que je suis coincé avec mon motor de recherche. Je récupère bien les données, mais seulement sur la première page. Sur la deuxième page j'ai rien... C'est que qqn pourrais m'aider? Merci d'avance!! :)

Voici ma page search.php:

<?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="get">
                <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"); ?>

Et enfin ma page function.php:

<?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);
print_r($result);
$nb_recettes = $result'nb_recettes'];
print_r($nb_recettes);
$perPage = 2;
$nb_Page = ceil($nb_recettes/$perPage);
print_r($nb_Page);
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);
  print_r($rows);

  if($rows){

    while($row = mysql_fetch_assoc($query)){
    echo "<strong>".$row'nomrecette']."</strong><br/><br/>".$row'preparation']."<br/><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>";
        }
}}
?>

11 réponses


Tackacoder
Réponse acceptée

C'est pas au bon endroit.
Dans search.php

if(isset($_POST'submit'])){
    $search=mysql_real_escape_string(htmlentities(trim($_POST'search'])));
    if(empty($search) && empty($_SESSION'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)){
        if(!empty($search)) {
            $_SESSION'search'] = $search;
        }
        else {
            $search = $_SESSION'search'];
        }
        resultat_recherche($search);

    }else{

    foreach($error as $errors){ echo $errors."<br/>";}
    }
}

et enlève dans function.php, au début

$search = $_POST'search'];
if(!empty($search)) {
    $_SESSION'search'] = $search;
}
else {
    $search = $_SESSION'search'];
}
Tackacoder
Réponse acceptée

Ok, je viens de voir un autre truc.
Dans search.php

if(isset($_POST'submit']) || isset($_SESSION'search'])){

Salut,
Il te manque une LIMIT dans ta requête. Le tuto de Grafikart t'aidera surement

harkrisz
Auteur

Merci, mais j'ai bien mis

$query=mysql_query("SELECT * FROM recettes WHERE $ou ORDER BY id_recettes LIMIT ".(($cPage-1)*$perPage).",$perPage");

Et pour ma première page j'ai bien 2 recettes qui s'affiche.

Perso j'ai compris la pagination grâce à ce tutoriel : http://antoine-herault.developpez.com/tutoriels/php/pagination-automatique-en-php/

Il est vieux mais toujours aussi efficace.

Je pense que le problème vient de ton $_POST. Pour la 1er page, la variable est rempli, mais lorsque tu changes de page, cette variable est vide.
Soit tu stockes ta variable POST dans une SESSION, soit tu renvoie les variable POST dans ton lien de page pour les récupérer en GET (avec http_build_query).

Tu peux aussi utiliser des systèmes de pagination via jquery.

harkrisz
Auteur

Merci! Maintenant j'ai ajouté $_SESSION'search'] = $_POST'search']; mais ça ne change rien. Qu'est-ce que je devrais encore faire?

Bonjour,
Si tu fait

$_SESSION'search'] = $_POST'search'];

, ça revient au même, car quand $_POST est vide, ta SESSION est vide aussi
Fait plutôt un truc du genre

$search = $_POST'search'];
if(!empty($search)) {
    $_SESSION'search'] = $search;
}
else {
    $search = $_SESSION'search'];
}
//ET APRES, TU UTILISES LA VARIABLE $search

et si tu ne l'as pas mis, oublie pas le session_start() au tout début de ton site

harkrisz
Auteur

Merci, j'ai ajouté ce code, mais ça n'a rien changé. Peut-être, j'ai mal fait? session_start() c'est placer dans ma page haut.php, donc les sessions fonctionnent.

Voici ma page function.php:

<?php
include 'includes/config.php';

function resultat_recherche($search)
{   $search = $_POST'search'];
if(!empty($search)) {
    $_SESSION'search'] = $search;
}
else {
    $search = $_SESSION'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>';
    }
}
?>

Et ma page search.php:

<?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"); ?>
harkrisz
Auteur

Merci, je l'ai fait, mais malheureusement je n'ai toujours pas de résultat sur la deuxième page.

harkrisz
Auteur

Ca fonctionne! Merci beaucoup! Un souci seulement, que j'arrive pas supprimer le résultat, je ne peux pas faire une autre recherche... Pourquoi?