[php] probleme affichage moteur de recherche

Fermé
ottis - 23 juin 2005 à 18:22
 Saber - 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.
A voir également:

21 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
23 juin 2005 à 20:59
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.
0
Merci beaucoup de ton aide, tout marche parfaitement maintenant.
0
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.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
24 juin 2005 à 21:56
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é.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je voudrais afficher les mots trouvés sans me soucier de leur provenance.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 juin 2005 à 12:59
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.
0
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' "); 
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 juin 2005 à 13:52
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.
0
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 ?
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 juin 2005 à 15:05
C'est sûrement la virgule en trop à côté de nom.$table3 entre select et from.
0
J'ai toujours la même erreur.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
26 juin 2005 à 13:22
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....
0
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%')  
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
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?
0
Oui, toutes mes tables ont exactement la meme structure, mais certaines sont encores vides. Elles possèdent toutes ces 2 champs.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
27 juin 2005 à 02:45
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') ");
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
27 juin 2005 à 02:50
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).
0
Je n'ai plus de message d'erreur mais rien ne s'affiche.
Encore merci de passer du temps sur mon problème.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
27 juin 2005 à 12:02
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....
0
Ca marche !!
Il y avait 2-3 petites erreurs mais je les ai corrigé et maintenant c'est nikel. Merci beaucoup de ton aide.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
27 juin 2005 à 14:41
De rien :-)
0