fonction moteur de recherche

Mammouth du PHP | 620 Messages

16 sept. 2009, 11:55

bonjour,
pour un de mes sites internet j'essai de mettre en place un petit moteur de recherche.
j'ai donc un table IWgalerie avec comme champs id type ref exemple alt photoref photoex
je souhaiterai que lorsqu'un internaute depuis le formulaire de recherche rentre par exemple un mot "ex: ville" resortir toutes les infos qui comprennent le mot ville (si par exemple dans ref on a le mot "ville gerardmer" on resorte les infos de l'enregistrement car l'internaute veut tout les info avec ville).

j'ai donc en recherchant un peu sur le net crée ce petit bout de code qui pour l'instant ne fonctionne pas car j'ai cette erreur qui m'est retournée :
Parse error: syntax error, unexpected T_VARIABLE in /homepages/41/d295213480/htdocs/recherche/search.php on line 18
la ligne 18 est
$ligne=mysql_fetch_array($resultat);
mon code est le suivant :
<?php
include("../admin/connexion-sql.php");

function search()
          {
$champ=$_POST['rechercherpar'];
$mot=$_POST['mot_cle'];

$resultat=mysql_query("select * from IWgalerie WHERE ref LIKE '$mot' ORDER BY type")
$ligne=mysql_fetch_array($resultat);
$nb=mysql_num_rows($resultat);
$i=0;
   while($i<$nb)
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
 echo $type.' '.$ref.' '.$alt
$i=$i+1;
          }
          }
search();
?>
pourriez vous m'aider à corriger cette erreur et faire en sorte que me recherche fonctionne.

Merci
Modifié en dernier par fabrice88250 le 16 sept. 2009, 12:01, modifié 1 fois.

Mammouth du PHP | 965 Messages

16 sept. 2009, 11:58

Tu as oublié le ; sur la ligne précédente.

Mammouth du PHP | 620 Messages

16 sept. 2009, 12:09

Arf oui et j'en avais oublié un autre plus bas. Sa fonctionne donc mais juste en partie car dans le cas de ma requette, sa fonctionnera si :
l'internaute rentre "gerardmer" et que dans mon champs je n'ai que "gerardmer"

moi j'aimerai que si l'internaute rentre "gerardmer" dans la recherche, j'ai toutes l'infos qui comprennent le mot "gerardmer" qui resorte (par exemple "la ville de gerardmer au coeur de la montagne des Vosges...".

idem si dans le recherche l'internaute rentre un suite de mot "la montagne" resortire toutes les infos qui contiennes "la montagne".

Mammouth du PHP | 965 Messages

16 sept. 2009, 12:14

Tu as la fonction FULLTEXT

Mammouth du PHP | 620 Messages

16 sept. 2009, 12:28

ok je viens de jetté un oeil sur FULLREXT mais sa m'obligerai si j'ai bien compri a ajouter un nouveau champ dans mes tables.
de plus depuis mysql je ne voi pas comment créé ce champ comme montré dans l'exemple "FULLTEXT (title,body)" pour le nom du champ ok --> FULLTEXT mais pour le type ? taille valeur ?...

mais bon j'y reviendrai surement plus tard. pour le moment j'ai ajouter sur ma requet des % --> select * from IWgalerie WHERE ref LIKE '%$mot%' ORDER BY type et du coup j'ai bien un resultat qui sort mais c'est 2 fois le meme alors qu'il devrait etre different.
Dans mon champs ref j'ai plusieurs enregistrements qui contienne le meme mot et je n'ai qu'un seul enregistrement qui resort en double.
Pourquoi les autre ne ressortent pas ?

ViPHP
ViPHP | 4039 Messages

16 sept. 2009, 13:05

Agité à raison, fulltext est le moteur de recherche intégré de mysql, like %% n'est pas une fonctionnalité de recherche, et l'utiliser comme tel est une erreur.

Il ne te faut pas créer de nouveaux champs, juste un nouvel index sur des champs existants (de type texte ou varchar, si je me souviens bien).

Et après tu auras une vrai fonctionnalité de recherche, plutôt qu'une comparaison bancale.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 620 Messages

16 sept. 2009, 13:33

bon ok j'ecoute vos conseils alors je vais me tourné vers FULLTEXT.
j'ai donc crée un fulltext dans index en y mettant les champs important.

après je ne comprend pas bien comment refaire mon moteur de recherche.
Modifié en dernier par fabrice88250 le 16 sept. 2009, 13:45, modifié 1 fois.

ViPHP
ViPHP | 4039 Messages

16 sept. 2009, 13:44

D'accord. Tu sais nous mettre un export de la structure de ta DB ? (export, create table et tout ça).
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 620 Messages

16 sept. 2009, 14:48

voilà ma table actuel avec le fulltext:

CREATE TABLE `IWgalerie` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`type` varchar(40) collate latin1_german2_ci default NULL,
`ref` varchar(20) collate latin1_german2_ci default NULL,
`exemple` varchar(20) collate latin1_german2_ci default NULL,
`alt` text collate latin1_german2_ci,
`photoref` varchar(255) collate latin1_german2_ci default NULL,
`photoex` varchar(255) collate latin1_german2_ci default NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `recherche` (`type`,`ref`,`exemple`,`alt`)
) ENGINE=MyISAM AUTO_INCREMENT=86 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=86 ;

ViPHP
ViPHP | 4039 Messages

16 sept. 2009, 15:39

Nul besoin de donner un nom à l'index fulltext, simplement définir quels champs seront utilisés suffit.
CREATE TABLE `IWgalerie` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `type` varchar(40) collate latin1_german2_ci default NULL,
  `ref` varchar(20) collate latin1_german2_ci default NULL,
  `exemple` varchar(20) collate latin1_german2_ci default NULL,
  `alt` text collate latin1_german2_ci,
  `photoref` varchar(255) collate latin1_german2_ci default NULL,
  `photoex` varchar(255) collate latin1_german2_ci default NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT (`type`,`ref`,`exemple`,`alt`)
) ENGINE=MyISAM AUTO_INCREMENT=86 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=86 ;


Ensuite, une requête telle que celle-ci devrait fonctionner:
select * from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots')
select * from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots' IN NATURAL LANGUAGE MODE)
Et même avec un score:
select id, match(`type`,`ref`,`exemple`,`alt`)  from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots')
Et ainsi de suite, match() against() te donne une infinie suite de possibilité et d'optimisations.
Le mieux, ceci dit, est d'ajouter un champ TEXT à ta table dans laquelle tu concatène tous les champs qui t'intéressent, sous forme normalisée, pour rendre l'indexation et la recherche plus rapide.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 620 Messages

16 sept. 2009, 15:57

bon j'avais aps mal avancé et j'avais modifié ma requette en fonction du fulltext. (question : si je laisse le nom sur fulltext est ce que sa change qqc ?)

par contre j'ai un probleme et je comprend pas pourquoi. dans mes champs j'ai pusieurs enregistrements qui contiennent le mot "corbeaux" et lorsque je lance ma recherche je n'ai qu'un seul enregistrement qui resort.

voilà ma fonction modifié :
<?php
include("../admin/connexion-sql.php");

function search()
          {
$champ=$_POST['rechercherpar'];
$mot=$_POST['mot_cle'];

$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('$mot')");
$ligne=mysql_fetch_array($resultat);

   while($ligne = mysql_fetch_array($resultat))
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
 echo $ligne['id'].' '.$type.' '.$ref.' '.$alt.'
<img src="../pages/mini-galerie.php?f='.$ligne['photoref'].'" alt="'.$ligne['alt'].'" border="0" width="168px" height="113px"/><br/>';

          }
          }
search();
?>

ViPHP
ViPHP | 4039 Messages

16 sept. 2009, 16:06

Le moyen le plus rapide pour voir d'ou peut venir le problème, c'est d'essayer la requête sous phpmyadmin. Si les résultats sont bon, c'est que le problème se situe dans le code.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 620 Messages

16 sept. 2009, 16:12

ah oui très bonne idée. j'ai donc fait le requette dans mysql et il me resort bien tous les enregistrement qui contiennent "corbeaux"
SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('corbeaux')");
mais je ne voi pas mon erreur dans mon code et pourquoi il ne me ressort qu'un seul enregistrement alors que mysql me les sort tous...

ViPHP
AB
ViPHP | 5818 Messages

16 sept. 2009, 16:41

SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('corbeaux')");
Berze vient de te dire que si ta requête fonctionne sous phpMyadmin c'est que l'erreur se situe ailleurs dans le code :!: :wink:

$ligne=mysql_fetch_array($resultat);

   while($ligne = mysql_fetch_array($resultat))
          {//...

Mammouth du PHP | 620 Messages

16 sept. 2009, 16:49

Berze vient de te dire que si ta requête fonctionne sous phpMyadmin c'est que l'erreur se situe ailleurs dans le code
ok j'ai bien compris et je ne voi toujours pas ou est mon erreur puisque j'ai bien des resultas mais pas complet..