Posez votre question Signaler

[php] probleme affichage moteur de recherche

ottis - Dernière réponse le 29 mars 2007 à 16:12
Bonjour,
J'amerais bien mettre en place sur mon site un moteur de recherche. Etant une tanche en prog, je me suis inspiré d'un script que j'ai trouvé sur le net. Dans ce script les resultats de la recherche sont affichés comme ceci :
nom trouvé
lien trouvé

Ce que je voudrais, sa serait un affichage dans ces eaux la mais je n'y arrive pas :

echo'<a href='lien trouve'>'nom trouve'</a>';


Voici le code d'affichage des resultats d'origine :

while ($nbre_mots < sizeof($motclef)) { 
 if (strlen($motclef[$nbre_mots]) > 2) { 
  $query_nom = mysql_query ("SELECT nom, lien FROM $table WHERE nom LIKE '%$motclef[$nbre_mots]%' "); 
  $query_lien = mysql_query ("SELECT nom, lien FROM $table WHERE lien LIKE '%$motclef[$nbre_mots]%' "); 
  while ($row_nom = mysql_fetch_array($query_nom)) { 
  echo 'Animes trouvé'; 
  echo '<br>'; 
  echo 'nom:'; 
  echo '<br>'; 
  printf ("%s", $row_nom[0]); 
  echo '<br>'; 
  echo 'lien:'; 
  echo '<br>'; 
  printf ("%s", $row_nom[1]); 
  echo '<br>';
  } 
 } 
 $nbre_mots++; 
} 


Merci d'avance.
Lire la suite 

[php] probleme affichage moteur de recherche »

22 réponses
Réponse
+0
moins plus
Dans la requête Sql, nom est invoqué en premier, puis lien en deuxième,
donc le tableau $row[0] contient le nom, et $row[1] le lien.

Donc ça donnerais ça:
while ($nbre_mots < sizeof($motclef)) { 
 if (strlen($motclef[$nbre_mots]) > 2) { 
  $query_nom = mysql_query ("SELECT nom, lien FROM $table WHERE nom LIKE '%$motclef[$nbre_mots]%' "); 
  $query_lien = mysql_query ("SELECT nom, lien FROM $table WHERE lien LIKE '%$motclef[$nbre_mots]%' "); 
  while ($row_nom = mysql_fetch_array($query_nom)) { 
  
  echo '<a href="'.$row[1].'">'.$row[0].'</a>';
  } 
 } 
 $nbre_mots++; 
}


Je te conseille de glaner quelques renseignements sur l'affichage de données en php, sur le rôle des guillemets (simples ou double) et sur la concatenation.
Ajouter un commentaire
Réponse
+0
moins plus
Merci beaucoup de ton aide, tout marche parfaitement maintenant.
Ajouter un commentaire
Réponse
+0
moins plus
Il y a une dernière chose que j'aimerais savoir.
Le script de recherche s'effectue pour le moment que sur une seule table. Est-il possible de sélectionner plusieurs tables avec $table ?

Un peu comme ceci :

$table = "table1_tbl+table2_tbl+etc...";


J'ai effectuer plusieurs recherches mais je n'ai rien trouvé et j'aimerais finir ce petit script assez rapidement.
J'apprendrais le php plus sérieusement après, je le jure ^^.
Merci d'avance.
Ajouter un commentaire
Réponse
+0
moins plus
Tu voudrais faire une recherche sur ces tables de quelle façon?
Par exemple tu voudrais faire la recherche dans ces tables et afficher les mots trouvés sans te soucier de leur provenance (leur table correspondante)?

Ou bien tu voudrais afficher à quelle table correspond chaque mot clef trouvé.
Ajouter un commentaire
Réponse
+0
moins plus
Je voudrais afficher les mots trouvés sans me soucier de leur provenance.
Ajouter un commentaire
Réponse
+0
moins plus
Alors on va dire que le nom de tes tables est stocké comme ceci:
$table1="table1";
$table2="table2";


Bon je pars du principe que dans ces tables tu as un champs "nom" et un champs "lien". Sinon il faudra adapter.
Ca donne donc ceci:
while ($nbre_mots < sizeof($motclef)) { 
 if (strlen($motclef[$nbre_mots]) > 2) {
   $like="%$motclef[$nbre_mots]%";
  $query_nom = mysql_query ("SELECT lien.$table1, nom.$table1,lien.$table2,nom.$table2, FROM $table1,$table2 WHERE (nom.$table1 LIKE '$like') AND nom.table2 LIKE '$like' "); 

  while ($row_nom = mysql_fetch_array($query_nom)) { 
  
  echo '<a href="'.$row[0].'">'.$row[1].'</a>';
  echo '<a href="'.$row[2].'">'.$row[3].'</a>';
  } 
 } 
 $nbre_mots++; 
}


J'ai simplifié quelques trucs. Et j'ai supprimé $query_lien qui ne servait à rien.
Ajouter un commentaire
Réponse
+0
moins plus
D'accord donc par exemple si j'ai 3 tables ça donne ça :
while ($nbre_mots < sizeof($motclef)) { 
 if (strlen($motclef[$nbre_mots]) > 2) {
   $like="%$motclef[$nbre_mots]%";
  $query_nom = mysql_query ("SELECT lien.$table1, nom.$table1,lien.$table2,nom.$table2,lien.$table3,nom.$table3,  FROM $table1,$table2,$table3 WHERE (nom.$table1 LIKE '$like') AND nom.table2 LIKE '$like' AND nom.table3 LIKE '$like' "); 

  while ($row_nom = mysql_fetch_array($query_nom)) { 
  
  echo '<a href="'.$row[0].'">'.$row[1].'</a>';
  echo '<a href="'.$row[2].'">'.$row[3].'</a>';
  echo '<a href="'.$row[4].'">'.$row[5].'</a>';
  } 
 } 
 $nbre_mots++; 
}


Ne manque-t-il pas $ ?
WHERE (nom.$table1 LIKE '$like') AND nom.$table2 LIKE '$like' AND nom.$table3 LIKE '$like' "); 
Ajouter un commentaire
Réponse
+0
moins plus
Si. J'ai fait une coquille.
Et j'ai aussi oublié des parenthèses au cas ou.
Et peut être qu'il vaut mieux utiliser OR que AND. Là j'ai un doute.

Donc:
WHERE (nom.$table1 LIKE '$like') OR (nom.$table2 LIKE '$like') OR (nom.$table3 LIKE '$like') "); 


Faudrait tester pour voir. Je ne sais pas ce que ça va donner.
Peut être qu'il vaut mieux faire une requête séparée pour chaque table.
Ajouter un commentaire
Réponse
+0
moins plus
J'ai tout testé mais il m'affiche ce message d'erreur :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource


Qu'entends-tu pas requête séparée ?
Ajouter un commentaire
Réponse
+0
moins plus
C'est sûrement la virgule en trop à côté de nom.$table3 entre select et from.
Ajouter un commentaire
Réponse
+0
moins plus
J'ai toujours la même erreur.
Ajouter un commentaire
Réponse
+0
moins plus
Ecris voir ceci en dessous du mysql_query:
echo "SELECT lien.$table1, nom.$table1,lien.$table2,nom.$table2,lien.$table3,nom.$table3 FROM $table1,$table2,$table3 WHERE (nom.$table1 LIKE '$like') OR (nom.$table2 LIKE '$like') OR (nom.$table3 LIKE '$like') ";


Ca devrait afficher la requête à l'écran..... Tu peux pourrait l'écraire ici?

Si ça n'affiche rien, transforme mysql_fetch_array par @mysql_fetch_array....
Ajouter un commentaire
Réponse
+0
moins plus
Voila se qui s'affiche :
SELECT lien.dossiersA_tbl, nom.dossiersA_tbl,lien.dossiersB_tbl,nom.dossiersB_tbl,lien.dossiersC_tbl,nom.dossiersC_tbl FROM dossiersA_tbl,dossiersB_tbl,dossiersC_tbl WHERE (nom.dossiersA_tbl LIKE '%blabla%') OR (nom.dossiersB_tbl LIKE '%blabla%') OR (nom.dossiersC_tbl LIKE '%blabla%')  
kilian- 26 juin 2005 à 17:08
Tu es sûr que tu as bien un champs "nom" et un champs "lien" dans les tables dossiersA_tbl, dossiersB_tbl et dossiersC_tbl?
Ajouter un commentaire
Réponse
+0
moins plus
Oui, toutes mes tables ont exactement la meme structure, mais certaines sont encores vides. Elles possèdent toutes ces 2 champs.
Ajouter un commentaire
Réponse
+0
moins plus
Argh oui excuse, j'ai fait tout de travers.
En fait ce n'est pas "champs.table" mais "table.champs".

Donc remplace ton mysql_query par:
mysql_query("SELECT $table1.lien, $table1.nom,$table2.lien,$table2.nom,$table3.lien,$table3.nom FROM $table1,$table2,$table3 WHERE ($table1.nom LIKE '$like') OR ($table2.nom LIKE '$like') OR ($table3.nom LIKE '$like') ");
Ajouter un commentaire
Réponse
+0
moins plus
Bon, maintenant, tu auras peut être des erreurs car certains pourront être remplis et pas d'autres.

PS: Je viens de tester chez moi. Ce genre de requête n'est pas trop appropriée car tu auras le bon resultat pour une table mais pas forcément pour l'autre. Donc il faut faire une requête distincte pour chaque table.

Je verrais ça demain, mais en gros, il faut que tu fasses comme au début pour une seule table et que tu répètes l'opération pour les autres tables (requête, affichage).
Ajouter un commentaire
Réponse
+0
moins plus
Je n'ai plus de message d'erreur mais rien ne s'affiche.
Encore merci de passer du temps sur mon problème.
Ajouter un commentaire
Réponse
+0
moins plus
Ok, voilà ce qu'il faudrait que tu fasses:
while ($nbre_mots < sizeof($motclef)) { 
 if (strlen($motclef[$nbre_mots]) > 2) { 
  $query_nom1 = mysql_query ("SELECT nom, lien FROM $table1 WHERE nom LIKE '%$motclef[$nbre_mots]%' "); 

  $query_nom2=mysql_query("SELECT nom, lien FROM $table2 WHERE nom LIKE '%$motclef[$nbre_mots]%' "); 

  $query_nom3=mysql_query("SELECT nom, lien FROM $table3 WHERE nom LIKE '%$motclef[$nbre_mots]%' "); 
 
  echo "<br><br>$table1 : <br><br>";
  while ($row1 = mysql_fetch_array($query_nom)) { 
  
          echo '<a href="'.$row1[1].'">'.$row1[0].'</a>';
  }
  
   echo "<br><br>$table2 : <br><br>";
   while ($row2 = mysql_fetch_array($query_nom)) { 
  
            echo '<a href="'.$row2[1].'">'.$row3[0].'</a>';
  } 

  echo "<br><br>$table3 : <br><br>";
   while ($row_nom3 = mysql_fetch_array($query_nom)) { 
  
             echo '<a href="'.$row[1].'">'.$row[0].'</a>';
  } 
 
 } 
 $nbre_mots++; 
}/


Voilà, en espérant qu'il n'ya pas de fautes....
Ajouter un commentaire
Réponse
+0
moins plus
Ca marche !!
Il y avait 2-3 petites erreurs mais je les ai corrigé et maintenant c'est nikel. Merci beaucoup de ton aide.
Ajouter un commentaire
Réponse
+0
moins plus
De rien :-)
Ajouter un commentaire
Ce document intitulé « [php] probleme affichage moteur de recherche » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
[php] probleme affichage moteur de recherche - page 2