Page 1 sur 1

HELP! Pb moteur de recherche

Posté : 17 avr. 2006, 15:29
par lyla
Salut à tous,

Voilà j'ai un pb très bizarre avec mon moteur de recherche: il affiche les résultats mais seulement sur la 1ère page !

En fait c'est pour un site de petites annonces immo, le moteur est assez simple: on choisi le type d'annonce (vente ou location) , et le type de bien (maison, appart, etc ...), on valide et on tombe sur la page de résultat.
Jusqu'ici tout va bien, les annonces correspondantes ont été trouvées mais quand on clique sur la page suivante ... plus rien !

Voici une partie du code:

Code : Tout sélectionner

//récupère choix du formulaire $offre = $_POST["type1"] ; $type = $_POST["type2"] ; $type2 = $_POST["type3"] ; //requête SQL: if($_POST["type3"] == 'all'){ $sql1 = "SELECT count(id) FROM annonces WHERE offre='$offre' AND type='$type'"; $sql2 = "SELECT * FROM annonces WHERE offre='$offre' AND type='$type' ORDER BY id DESC limit "; }else{ $sql1 = "SELECT count(id) FROM annonces WHERE offre='$offre' AND type='$type' AND type2='$type2'"; $sql2 = "SELECT * FROM annonces WHERE offre='$offre' AND type='$type' AND type2='$type2' ORDER BY id DESC limit "; } $select = $sql1 ;//compte le nombre à afficher au total $result = mysql_query($select,$cnx) or die ('Erreur : '.mysql_error() ); $row = mysql_fetch_row($result); $total = $row[0]; echo ("<b><br>RECHERCHE DE BIENS </b>- ".$total." résultat(s) trouvé(s)<br><br>"); require "fonctions.php"; $nombre = 4; // afficher 4 résultats par page. if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois: limite = 0. // on cherche le nom de la page. $path_parts = pathinfo($_SERVER['PHP_SELF']); $page = $path_parts['basename']; $select = $sql1 ;//compte le nombre à afficher au total $result = mysql_query($select,$cnx) or die ('Erreur : '.mysql_error() ); $row = mysql_fetch_row($result); $total = $row[0]; //vérifier la validité de notre variable $limite; $verifLimite= verifLimite($limite,$total,$nombre); // si la limite passée n'est pas valide on la remet à zéro if(!$verifLimite) { $limite = 0; } // requête SQL qui ne prend que le nombre d'enregistrements nécessaire à l'affichage. $select = $sql2.$limite.",".$nombre; $result = mysql_query($select,$cnx) or die ('Erreur : '.mysql_error() ); // si on a récupéré un resultat on l'affiche. if($total) { while($row = mysql_fetch_array($result)) { special($row['special'],$row); } } else echo "<br><br><div class='txt' align='center'><B>Aucune annonce ne correspond<br> à votre recherche pour le moment ...<br><br></B></div>"; mysql_free_result($result); // si le nombre d'enregistrement à afficher est plus grand que $nombre if($total > $nombre) { // affichage des liens vers les pages affichePages($nombre,$page,$total); } echo "<table width='400' align='right' cellspacing='2'><tr><td align='center'>"; $limitesuivante = $limite + $nombre; $limiteprecedente = $limite - $nombre; if($limite != 0) { echo '<a href="'.$page.'?limite='.$limiteprecedente.'"><< Page précédente</a>'; } echo "</td><td align='center'>"; if($limitesuivante < $total) { echo '<a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante >></a>'; } echo "</td></tr></table><br>";
Fonctions :

Code : Tout sélectionner

//Fonction qui vérifie la validité de $limite récupération de $limite if(isset($_GET['limite'])) $limite=$_GET['limite']; else $limite=0; function verifLimite($limite,$total,$nombre) { if(is_numeric($limite)) { // si $limite est entre 0 et $total, $limite est ok // sinon $limite n'est pas valide. if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) { // j'assigne 1 à $valide si $limite est entre 0 et $max $valide = 1; } else { // sinon j'assigne 0 à $valide $valide = 0; } } else { // si $limite n'est pas numérique j'assigne 0 à $valide $valide = 0; } // je renvois $valide return $valide; } //Fonction qui affiche les liens vers les pages function affichePages($nb,$page,$total) { $nbpages=ceil($total/$nb); $numeroPages = 1; $compteurPages = 1; $limite=0; $page_active = ceil(($_GET['limite']/$nb)+1); echo '<table border = "0" align="right" cellspacing="2"><tr>'; while($numeroPages <= $nbpages) { if($numeroPages!=$page_active){echo '<td class="txt" align="center">| <a href = "'.$page.'?limite='.$limite.'" class="lien">'.$numeroPages.'</a></td>';} else{echo '<td class="txtOrange" align="center">| <b>'.$numeroPages.'</b></td>';} $limite = $limite + $nb; $numeroPages = $numeroPages + 1; $compteurPages = $compteurPages + 1; } echo '</tr></table><br>'; }
Je comprend pas tellement car j'utilise le même code pour afficher les annonces de ventes sur une autre page, idem pour les locations et là ça fonctionne. La seule différence est dans les 2 requêtes :

Code : Tout sélectionner

$sql1 = "SELECT count(id) FROM annonces WHERE offre='Vente'"; $sql2 = "SELECT * FROM annonces WHERE offre='Vente' ORDER BY id DESC limit ";
Voilà, j'espère que ça vous parlera et que vous pourrez m'aider parce que là je suis vraiment dans l'impasse :cry:

Posté : 17 avr. 2006, 17:42
par Truc
Salut,

Tu n'intégres pas le résultat du formulaire dans les liens de la pagination (lien de navigation de page en page).

après validation du formulaires les variables POST existent mais après clic sur un lien elle n'existent plus donc problème.

Il faut donc intégrer le résultat POST du formulaire dans les liens pour les récupérer en GET sur les liens.

Code de récupération des variables POST (si elles existent) sinon récupération GET:
$offre = (isset($_POST["type1"])) ? $_POST["type1"] : ( (isset($_GET["type1"])) ? $_GET["type1"] : "" ) ; 
fait en de même pour $type = $_POST["type2"] et $type2 = $_POST["type3"] .

Pour la syntaxe il s'agit de l'opérateur ternaire

puis ajout sur les liens:
'<a href = "'.$page.'?limite='.$limite.'&type1='.$offre.'&type='.$type2.'&type2='.$type3.' class="lien">'.$numeroPages.'</a>
Préfère les balises
 au [code] pour du php c'est plus lisible.

Posté : 17 avr. 2006, 20:09
par lyla
Merci pour ta réponse ! :merci:

J'ai bien cru que ça allait marcher cette fois, mais non ...

Voilà ce que j'ai fait :
$offre = (isset($_POST["type1"])) ? $_POST["type1"] : ( (isset($_GET["type1"])) ? $_GET["type1"] : "" ) ;
$type = (isset($_POST["type2"])) ? $_POST["type2"] : ( (isset($_GET["type2"])) ? $_GET["type2"] : "" ) ;
$type2 = (isset($_POST["type3"])) ? $_POST["type3"] : ( (isset($_GET["type3"])) ? $_GET["type3"] : "" ) ;  
et pour les liens:
<a href = "'.$page.'?limite='.$limite.'&type1='.$offre.'&type='.$type2.'&type2='.$type3.'" class="lien">'.$numeroPages.'</a>
Mais rien à y faire, il ne les récupèrent pas. Le lien de la 2ème page de résultat affiche:

Code : Tout sélectionner

result.php?limite=4&type1=&type=&type2=
Est-ce que j'aurais oublié quelque chose ??? :-k

ps: intéressant l'opérateur ternaire, je connaissais pas, merci !

Posté : 17 avr. 2006, 22:11
par Truc
Hmm, le lien devrai ressembler à ceci:
echo '<td class="txt" align="center">| 
<a href = "'.$page.'?limite='.$limite.'&type1='.$offre.'&type='.$type2.'&type2='.$type3.'" class="lien">'.$numeroPages.'</a>
</td>';
affiche les variables juste après la récupération:
echo $offre;
mais dès le 1er chargement après la validation du formulaire du dois déjà avoir ces variables dans l'url du lien.

Posté : 17 avr. 2006, 23:40
par lyla
Ben les variables s'affichent bien et le lien a l'air correct :
echo '<td class="txt" align="center">| <a href = "'.$page.'?limite='.$limite.'&type1='.$offre.'&type='.$type2.'&type2='.$type3.'" class="lien">'.$numeroPages.'</a></td>';
En fait, non j'ai pas les variables dans l'url au 1er chargement sauf si je met le formulaire en get mais là j'ai essayé et ça marche pas non plus.

Pour être un plus claire sur le déroulement:
- j'ai une page "index.php" avec le formulaire de recherche
- ce formulaire envoie vers la page "result.php"
- result.php récupère d'abord les données
$offre = (isset($_POST["type1"])) ? $_POST["type1"] : ( (isset($_GET["type1"])) ? $_GET["type1"] : "" ) ;
$type = (isset($_POST["type2"])) ? $_POST["type2"] : ( (isset($_GET["type2"])) ? $_GET["type2"] : "" ) ;
$type2 = (isset($_POST["type3"])) ? $_POST["type3"] : ( (isset($_GET["type3"])) ? $_GET["type3"] : "" ) ;  
-puis requête sql:
if($type2 == 'all'){
$sql1 = "SELECT count(id) FROM annonces WHERE offre='$offre' AND type='$type'";
$sql2 = "SELECT * FROM annonces WHERE offre='$offre' AND type='$type' ORDER BY id DESC limit ";
}else{
$sql1 = "SELECT count(id) FROM annonces WHERE offre='$offre' AND type='$type' AND type2='$type2'";
$sql2 = "SELECT * FROM annonces WHERE offre='$offre' AND type='$type' AND type2='$type2' ORDER BY id DESC limit ";
}
$select = $sql1 ;//compte le nombre à afficher au total
$result = mysql_query($select,$cnx) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];
echo ("<b><br>RECHERCHE DE BIENS </b>- ".$total." résultat(s) trouvé(s)<br><br>");
- puis affiche les résultats, selon $offre
if($offre == 'Location'){
include "affich-loc.php";
}else {
include "affich-vente.php";
}
- affich-vente.php et affich-loc.php contiennent :
require "fonctions.php";
$nombre = 4;  // afficher 4 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois: limite = 0.
// on cherche le nom de la page.   
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];

$select = $sql1 ;//compte le nombre à afficher au total
$result = mysql_query($select,$cnx) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];

//vérifier la validité de notre variable $limite;
$verifLimite= verifLimite($limite,$total,$nombre);
// si la limite passée n'est pas valide on la remet à zéro
if(!$verifLimite)  {
    $limite = 0;
}
// requête SQL qui ne prend que le nombre d'enregistrements nécessaire à l'affichage.
$select = $sql2.$limite.",".$nombre;
$result = mysql_query($select,$cnx)  or die ('Erreur : '.mysql_error() );

// si on a récupéré un resultat on l'affiche.
if($total) {      
   while($row = mysql_fetch_array($result)) {
special($row['special'],$row);
    }
}
else echo "<br><br><div class='txt' align='center'><B>Aucune annonce ne correspond<br> à votre recherche pour le moment ...<br><br></B></div>";
mysql_free_result($result);

// si le nombre d'enregistrement à afficher est plus grand que $nombre
if($total > $nombre) {
    // affichage des liens vers les pages
      affichePages($nombre,$page,$total);
}
- Si il y a plus de 4 résultats, on affiche les liens vers les autres pages. Fonction contenue dans fonctions.php :
//Fonction qui affiche les liens vers les pages
function affichePages($nb,$page,$total) {
        $nbpages=ceil($total/$nb);
        $numeroPages = 1;
        $compteurPages = 1;
				$limite=0;
				$page_active = ceil(($_GET['limite']/$nb)+1);        
	echo '<table border = "0" align="right" cellspacing="2"><tr>';
while($numeroPages <= $nbpages) {
	if($numeroPages!=$page_active){echo '<td class="txt" align="center">| <a href = "'.$page.'?limite='.$limite.'&type1='.$offre.'&type='.$type2.'&type2='.$type3.'" class="lien">'.$numeroPages.'</a></td>';}
	else{echo '<td class="txtOrange" align="center">| <b>'.$numeroPages.'</b></td>';}

$limite = $limite + $nb;
$numeroPages = $numeroPages + 1;
$compteurPages = $compteurPages + 1;
        }
				
        echo '</tr></table><br>';
}
Et c'est là que ça bug, puisque le lien de la page 2 récupère des variables vides ...

](*,)

Posté : 18 avr. 2006, 00:26
par lyla
Du nouveau !

J'ai fait passé les variables dans la fonction:
affichePages($nombre,$page,$total,$offre,$type,$type2);
Du coup on retrouve bien les variables dans l'url, mais bien sûr c'était trop beau, les résultats ne sont toujours pas affichés après la 1ère page ! :evil:

J'y comprend rien ça devrait pourtant marcher maintenant !?!

Posté : 18 avr. 2006, 01:23
par Truc
Dans le feu de l'action tu n'aurais pas oublié la récupération de la limite ?

regarde bien les indices, tu as des types1, type et type2 dans le lien
et à la récupération types1, type2 et type3

Posté : 18 avr. 2006, 10:06
par lyla
Ayéé ça maaaarrrche !! :D
C'était bien un problème avec types1, type et type2 dans le lien
et types1, type2 et type3 à la récupération ... :langue:

Waou j'suis trop contente !
Un grand GRAND merci pour ton aide si précieuse.

:pouce: