Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1230 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  probleme moteur de recherche php

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme moteur de recherche php

n°1112552
yaz17
Posté le 08-06-2005 à 12:54:57  profilanswer
 

Bonjour,  
 
Je sollicite encore une fois votre aide sur un probléme que j'ai vraiment du mal à résoudre. Sur mon site j'ai une page base de données qui permet de faire une recherche soit par titre, par auteur, editeur... ou une recherche sur tout les critéres dans la table archives. Mon moteur de recherche fonctionnait bien jusqu'au moment où j'ai voulu ajouter un systéme de limitation des résultats à l'affichage, au maximum 20 résultats par pages. Pour ce faire, j'utilise une fonction que j'ai prise sur le web qui permet un affichage page par page.
 
Voici mon formulaire :
 

Code :
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form method="post" action="resultat.php">
  6. <table width="260" align="center">
  7. <!--DWLayoutTable-->
  8. <tr>
  9. <td colspan="2">Titre : </td>
  10. <td width="145"><input type="text" name="titre"></td>
  11. </tr>
  12. <tr>
  13. <td colspan="2">Auteur : </td>
  14. <td><input type="text" name="auteur"></td>
  15. </tr>
  16. <tr>
  17. <td colspan="2" valign="middle">Editeur : </td>
  18. <td><input type="text" name="editeur"></td>
  19. </tr>
  20. <tr>
  21. <td colspan="2" valign="middle">Association : </td>
  22. <td><input type="text" name="association"></td>
  23. </tr>
  24. <tr>
  25. <td colspan="2" valign="middle">Mot clé : </td>
  26. <td><input type="text" name="cles"></td>
  27. </tr>
  28. <tr align="right" valign="middle">
  29. <td colspan="3"><br>
  30.   <input type="checkbox" name="allcriteres" value="oui">Tous les critères</td>
  31. </tr>
  32. <tr align="right" valign="middle">
  33.   <td colspan="3"><input type="submit" name="recherche" style="background-color:#CCCCCC " value="Chercher"></td>
  34. </tr>
  35. <tr align="left" valign="middle">
  36.   <td width="17" height="21" colspan="1" valign="bottom"> <br>
  37.     <img src="images/info.gif" width="19" height="19"> </td>
  38. <td colspan="2" valign="middle"><br>
  39.   un mot maximum par case</td>
  40.   </tr>
  41. <tr>
  42.   <td height="5"></td>
  43.   <td width="76"></td>
  44.   <td></td>
  45. </tr>
  46. </table>
  47. </form>
  48. </body>
  49. </html>


 
mon fichier de fonctions :
 

Code :
  1. <?
  2.     function barre_navigation ($nb_total,
  3.     $nb_affichage_par_page,
  4.     $debut,
  5.     $nb_liens_dans_la_barre) {
  6.     $barre = '';
  7.    
  8.     // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT
  9.     if ($_SERVER['QUERY_STRING'] == "" ) {
  10.         $query = $_SERVER['PHP_SELF'].'?debut=';
  11.     }
  12.     else {
  13.         $tableau = explode ("debut=", $_SERVER['QUERY_STRING']);
  14.         $nb_element = count ($tableau);
  15.         if ($nb_element == 1) {
  16.             $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut=';
  17.         }
  18.         else {
  19.             if ($tableau[0] == "" ) {
  20.                 $query = $_SERVER['PHP_SELF'].'?debut=';
  21.             }
  22.             else {
  23.                 $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut=';
  24.             }
  25.         }
  26.     }
  27.    
  28.     // on calcul le numéro de la page active
  29.     $page_active = floor(($debut/$nb_affichage_par_page)+1);
  30.     // on calcul le nombre de pages total que va prendre notre affichage
  31.     $nb_pages_total = ceil($nb_total/$nb_affichage_par_page);
  32.    
  33.     // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin)
  34.     // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11
  35.     if ($nb_liens_dans_la_barre%2==0) {
  36.         $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1;
  37.         $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2);
  38.     }
  39.     else {
  40.         $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2));
  41.         $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2));
  42.     }
  43.    
  44.     if ($cpt_deb1 <= 1) {
  45.         $cpt_deb = 1;
  46.         $cpt_fin = $nb_liens_dans_la_barre;
  47.     }
  48.     elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) {
  49.         $cpt_deb = $cpt_deb1;
  50.         $cpt_fin = $cpt_fin1;
  51.     }
  52.     else {
  53.         $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1;
  54.         $cpt_fin = $nb_pages_total;
  55.     }
  56.     if ($nb_pages_total <= $nb_liens_dans_la_barre) {
  57.         $cpt_deb=1;
  58.         $cpt_fin=$nb_pages_total;
  59.     }
  60.    
  61.     // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
  62.     if ($cpt_deb != 1) {
  63.         $cible = $query.(0);
  64.         $lien = '<A HREF="'.$cible.'">&lt;&lt;</A>&nbsp;&nbsp;';
  65.     }
  66.     else {
  67.         $lien='';
  68.     }
  69.     $barre .= $lien;
  70.     // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active
  71.     for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) {
  72.         if ($cpt == $page_active) {
  73.             if ($cpt == $nb_pages_total) {
  74.                 $barre .= $cpt;
  75.             }
  76.             else {
  77.                 $barre .= $cpt.'&nbsp;-&nbsp;';
  78.             }
  79.         }
  80.         else {
  81.             if ($cpt == $cpt_fin) {
  82.                 $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
  83.                 $barre .= "'>".$cpt."</A>";
  84.             }
  85.             else {
  86.                
  87.                 $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
  88.                 $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;";
  89.             }
  90.         }
  91.     }
  92.    
  93.     $fin = ($nb_total - ($nb_total % $nb_affichage_par_page));
  94.     if (($nb_total % $nb_affichage_par_page) == 0) {
  95.         $fin = $fin - $nb_affichage_par_page;
  96.     }
  97.         // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation
  98.     if ($cpt_fin != $nb_pages_total) {
  99.         $cible = $query.$fin;
  100.         $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">&gt;&gt;</A>';
  101.     }
  102.     else {
  103.         $lien='';
  104.     }
  105.     $barre .= $lien;
  106.     return $barre;   
  107. }
  108. ?>


 
Mon fichier d'action :
 

Code :
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <?php
  6.  include("config.php" );
  7.  require("fonctions.php" );
  8.  // on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages
  9.  $sql  = 'SELECT count(*) FROM archives';
  10.  // on exécute cette requête
  11.  $resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
  12.  // on récupère le nombre d'éléments à afficher
  13.  $nb_total = mysql_fetch_array($resultat);
  14.  // on teste si ce nombre de vaut pas 0
  15.  if (($nb_total = $nb_total[0]) == 0) {
  16.   echo 'Aucune réponse trouvée';
  17.  }
  18.  else {
  19.   echo '<table width="626" border="0">';
  20.   // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
  21.   if (!isset($_GET['debut'])) $_GET['debut'] = 0;
  22.   $nb_affichage_par_page = 10;
  23.   if ( $allcriteres == "oui" )
  24.       $operateur="AND";
  25.     else
  26.     $operateur="OR";
  27.     if ($titre != "" )
  28.     $finrequete .= " titre_archives LIKE '%$titre%'";
  29.     if ($auteur != "" )
  30.     if ($finrequete != "" )
  31.     $finrequete .= " $operateur (auteur_archives LIKE '%$auteur%')";
  32.     else
  33.     $finrequete .= " (auteur_archives LIKE '%$auteur%')";
  34.     if ($editeur != "" )
  35.     if ($finrequete != "" )
  36.     $finrequete .= " $operateur editeur_archives LIKE '%$editeur%'";
  37.     else
  38.     $finrequete .= " editeur_archives LIKE '%$editeur%'";
  39.     if ($association != "" )
  40.     if ($finrequete != "" )
  41.     $finrequete .= " $operateur reference_archives LIKE '%$association%'";
  42.     else
  43.     $finrequete .= " reference_archives LIKE '%$association%'";
  44.     if ($cles != "" )
  45.     if ($finrequete != "" )
  46.     $finrequete .= " $operateur keywords_archives LIKE '$cles'";
  47.     else
  48.     $finrequete .= " keywords_archives LIKE '$cles'";
  49.     if ($finrequete != "" )
  50.     $sql="SELECT * FROM archives WHERE $finrequete ORDER BY titre_archives LIMIT ".$_GET['debut'].','.$nb_affichage_par_page;
  51.     else
  52.     $sql='SELECT * FROM archives ORDER BY titre_archives LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;
  53.     $res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
  54.     while ($result = mysql_fetch_array($res)) {
  55.     ?>
  56.     <tr>
  57.                  <td bgcolor="#CCCCCC" width="251"><div align="left" class="verdananobold"><? echo stripslashes($result['titre_archives']) ?></div></td>
  58.                  <td bgcolor="#CCCCCC" width="272"><div align="left" class="verdananobold"><? echo stripslashes($result['auteur_archives']) ?></div></td>
  59.                  <td bgcolor="#CCCCCC" width="88"><div align="center"><a href="show.php?id=<? echo stripslashes($result['id_archives']) ?>"><img src="images/lire.gif" name="id" width="16" height="11" border="0" id="id"></a></div></td>
  60.                  </tr>
  61.   <?
  62.   }
  63.   // on libère l'espace mémoire alloué pour cette requête
  64.   mysql_free_result ($res);
  65.   echo '<table><br />';
  66.   // on affiche enfin notre barre<br>
  67.   echo 'pages : ';
  68.   echo '<span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>';
  69.  }
  70.  // on libère l'espace mémoire alloué pour cette requête
  71.  mysql_free_result ($resultat);
  72.  // on ferme la connexion à la base de données.
  73.  mysql_close ();
  74.  ?>
  75. </body>
  76. </html>


 
En fait j'ai fais beaucoup de tests et apparament ça fonctionne mais seulement lorsque la valeur de [color=red]$nb_affichage_par_page[/color](dans fichier d'action) est supérieur au nombre d'enregistrements contenus dans la table, sinon ça renvoi un résultat complétement incohérent.
 
Et voici le lien pour comprendre plus précisément mon probleme http://yazworld.free.fr/site/bdd.php
 
Voilà si vous y comprenez quelque chose, je vous remerci de bien vouloir m'apporter votre aide.
 
Merci,  
Yaz.

mood
Publicité
Posté le 08-06-2005 à 12:54:57  profilanswer
 

n°1112601
denzz
huhuuuuu ! (désolé )
Posté le 08-06-2005 à 13:29:28  profilanswer
 

mmmh, j'ai pas tout lu mais je pense que tu devrais recoder ca comme un grand pour ne pas avoir de problèmes...
 
en utilisant la clause LIMIT n,m (je c plus exactement la syntaxe) de tes requêtes SQL, tu peux demander les enregistrements entre n et m ... ce qui te permet, à partir d'un numéro de page et d'un nombre d'enregistrements par page, de construire la requête qui va bien pour la page que tu veux .. surtout si c'est uniquement pour 1 partie de ton site, ca me paraît plus simple de refaire ca a la mano...
 
non ?  
 
 
 
 

n°1112785
yaz17
Posté le 08-06-2005 à 15:34:14  profilanswer
 

Salut denzz,
 
En fait ce fonction est utilisé sur plusieurs de mon site, je l'appel à partir de mon fichier de fonctions. En fait la requête du else fonctionne bien :  

Code :
  1. $sql='SELECT * FROM archives ORDER BY titre_archives LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;


 
Par contre celle qui me pose probleme c'est la requête prise en compte lorsque l'utilisateur rentre des critéres :
 

Code :
  1. $sql="SELECT * FROM archives WHERE $finrequete ORDER BY titre_archives LIMIT ".$_GET['debut'].','.$nb_affichage_par_page;


 
Je pense pas que ce soit un gros probléme, cette derniére marche mais renvoi un résultat incohérent.
 
Voilà si quelqu'un a une idée..
 
Merci de m'aider

n°1112801
ritzle
Posté le 08-06-2005 à 15:44:49  profilanswer
 

la syntaxe c'est  
WHERE champ='valeur'

n°1112851
yaz17
Posté le 08-06-2005 à 16:15:19  profilanswer
 

salut Ritzle,  
 
Oui c'est l'une des utilisations possibe mais je peux aussi faire ça :

Code :
  1. $sql="SELECT * FROM archives WHERE titre_archives LIKE '%$titre%' ORDER BY titre_archives LIMIT 0,3";


 
et ça marche très bien en me renvoyant le résultat voulu..


Message édité par yaz17 le 08-06-2005 à 16:15:54
n°1112866
ritzle
Posté le 08-06-2005 à 16:22:33  profilanswer
 

donc $finrequete peut contenir les valeurs "titre_archives LIKE '%$titre%'" ou "titre_archives='$titre'" ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  probleme moteur de recherche php

 

Sujets relatifs
wxScintilla, problème d'installationc++ et xml: probleme de copier/coller/supprimer
Problème login avec ma gallerie photo coppermineprobleme de cryptage de mot de passe
[Java][JExcel / JXL] Problème avec les liens entre feuilles[Flash/XML] Problème de caractères html à l'importation --> corréen ?
Probleme avec tableaux, demande d'aide aux spécialistes!Config serveur probleme history.back()
problème SQL moteur de rechercheProblème avec un moteur de recherche
Plus de sujets relatifs à : probleme moteur de recherche php


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR