problème à la création d'un moteur de recherche.

Mammouth du PHP | 558 Messages

02 avr. 2008, 17:23

j'ai essayé de créer un moteur de recherche pour mon site mais j'ai une erreur.
formulaire.

Code : Tout sélectionner

<form action="moteur.php" method="post"> votre recherche:<input name="recherche"> <input type="submit" value="rechercher">
recupération et traitement des données.
<?php
include("php/connectionbd.php");
$rech1=mysql_query("SELECT * from produit");
while($rech=mysql_fetch_assoc($rech1))
{
extract($rech);
$table=array($id,$code_produit,$cathegorie,$type,$petite_image,$grande_image,$description,$prix,$taille,$stock);
$recherche=str_replace(' ',',',$_POST['recherche']);
$recherche1=array($recherche);
ereg("$recherche1{0,100}",$table);
}
le message d'erreur est:

Code : Tout sélectionner

Notice: Array to string conversion in c:\program files\easyphp1-8\www\www1\moteur.php on line 10
cela fait 3 jours que je suis dessus et je ne m'en sort pas.
merci.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 avr. 2008, 18:14

bah euh... tu déclares $table et $recherche1 comme étant des tableaux, et du coup tu te fais jeter par ereg qui attend des chaine et non pas des tableaux en argument...

peut être en regardant du côté de in_array() ? (j'ai pas vraiment regardé ce que tu voulais faire ceci dit...)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 558 Messages

02 avr. 2008, 18:43

merci Ryle
plus de message d'erruer mais pas de reponse alors que je devrais en avoir.
je vous met le dernier code.
<?php 
include("php/connectionbd.php"); 
$rech1=mysql_query("SELECT * from produit"); 
while($rech=mysql_fetch_assoc($rech1)) 
{ 
extract($rech); 
$table=array($id,$code_produit,$cathegorie,$type,$petite_image,$grande_image,$description,$prix,$taille,$stock); 
$recherche=str_replace(' ',',',$_POST['recherche']); 
$recherche1=array($recherche); 
if(in_array($recherche1,$rech))
{
echo"$id <br>";
} 
} 
vue que le fetch_assoc() cree un tableau j'essaye d'optimise au maxi mais meme en ecrivant
"if(in_array($recherche1,$table))"
je n'ai pas de reponse non plus.

ViPHP
ViPHP | 4039 Messages

02 avr. 2008, 19:06

C'est courageux de vouloir réinventer la roue, mais pourquoi pas directement exploiter les possibilités de recherche full-text de mysql ?
(recherche naturelle, recherche booléenne, query expansion)

Ce sera sans doute mieux que tout ce que tu pourras coder en php (sans vouloir t'offenser, mais programmer un moteur de recherche performant, c'est un métier en soi)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 558 Messages

02 avr. 2008, 19:22

j'ai bien essaye par la au debut mais sa me fait une requete sql a rallonge un where clause par champs.

ViPHP
ViPHP | 4039 Messages

02 avr. 2008, 19:34

fait une table "recherche" ou tu concatènes tout les champs.. avec juste un champ "ID" et un champ "TEXTE".

Tout dépend aussi du type de recherche que tu veux faire faire. (simple, genre google, ou avec un formulaire complexe avec recherche par champ)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 558 Messages

02 avr. 2008, 19:54

c'est tres simple en fait ce que je veux faire c'est rechercher si une expression reguliere se retrouve dans un des champs de ma table.
si non recherche une valeur approché.
et enfin si il n'y a toujours rienafficher un message disant que la recherche n'as pas abouti.
mais cela s'avere plus complexe que ce que j'avais prevu.
vue que j'ai besoin des valeur indépdante pour faire mes lien vers les page je vais ajouté un champs recherche en texte mais le probleme reste la requete comme il faut faire ceci

Code : Tout sélectionner

SELECT * FROM produit WHERE recherche LIKE '%mot1%' OR recherche LIKE '%mot2%' OR recherche LIKE '%mot3%' (etc...)
la cela me crée 2 probleme le premier c'est que j'ignore le nombre de mots qui vont être utilisé et le deuxieme la longueur de la requete.
il n'existerais pas une sorte de tableau qui fonctionnerais avec la bd? qui me permettrait d'aligne chaque mots sépare par un charactere ou autre.
je plante encore une fois

Mammouth du PHP | 558 Messages

03 avr. 2008, 21:25

toujours d'actu.
up

ViPHP
ViPHP | 4039 Messages

03 avr. 2008, 22:29

(pas bien les ups)

Tu as vu que tu peux indexer plusieurs champs avec le fulltext ?

ça donnerait ceci sinon (en m'inspirant de ton exemple) :

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH recherche AGAINST ('tous les mots que tu veux')
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 avr. 2008, 23:00

Modération :
hakazizi, les "up" sont interdits sur PHPFrance.

Si tu n'as pas obtenu de réponse, c'est (au choix) :
- que ta question est mal formulée : reformule-la différemment ;
- que personne ne connaît la réponse ici : faire un "up" ne te donnera pas davantage de résultats ;
- que la réponse demandée exige un travail important que personne ne va faire à ta place ;
- que trop peu de temps s'est écoulé depuis ton précédent message pour qu'un membre ait pu y répondre.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 558 Messages

04 avr. 2008, 11:00

je ne demande pas a ce que l'on fasse le travail a ma place bien au contraire mais quand on tourne en rond pendant plusieurs jours on a parfois besoins d'etre guidé par ceux qui ont les connaissances.
a moins d'avoir mal compris cette parti du reglement j'ai relancer le sujet en faisant un up plus de 24h apres le dernier message posté.
http://www.phpfrance.com/forums/voir_sujet-12542.php 10eme regles.
Laissez le temps au temps
Si vous n'avez pas de réponse dans l'heure qui suit votre message, ce n'est pas la peine de poster un UP qui ne sert à rien, sauf à polluer un thread.
Donnez vous un minimum de 24h avant de relancer un sujet
(pas bien les ups)

Tu as vu que tu peux indexer plusieurs champs avec le fulltext ?

ça donnerait ceci sinon (en m'inspirant de ton exemple) :

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH recherche AGAINST ('tous les mots que tu veux')
ok merci je vait essayer sa.

ViPHP
ViPHP | 4039 Messages

04 avr. 2008, 11:18

Un lien vers la doc, pour être sur que tu puisse bien saisir la chôse:
http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 422 Messages

04 avr. 2008, 13:37

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH recherche AGAINST ('tous les mots que tu veux')
Regarde bien la doc citée par Berzemus pour la syntaxe du fulltext MySQL

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH (nom,description) AGAINST ('les mots que je recherche);
Et attention a bien marqué les champs que tu veux utiliser dans la recherche comme étant avec un index FULLTEXT

Mammouth du PHP | 558 Messages

05 avr. 2008, 23:46

pour le moment je suis en train de tout recreer.
je vous met le code ci-dessous.
Je ne trouve pas de fonction permettant de supprimer certainne lettre si celle-ci se trouve en fin de mots.
c'est a dire que si un "a", "t", "d", "s", "x" (lettre qui sont souvent oublier lors d'une recherche) ne perturbe pas la recherche.
si vous avez des suggestion pourle rendre plus performant ou optimiser le code n'hesitez pas.
merci.
$recherch = $_POST['recherche'];
// On supprime les accents et on remplace les c en s ainsi que tout charactere speciaux en espace
$replace=array('à','â','ä','ç','c','è','é','ê','ë','î','ï','y','ô','ö','ù','û','ü',"'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=array('a','a','a','s','s','e','e','e','e','i','i','i','o','o','u','u','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recherch = str_replace($replace,$by,$recherch);
$recherch = strtolower($recherch);
$recherch = preg_replace('`(.)\1`', '$1', $recherch);
$resultat1=mysql_query("SELECT * FROM produit WHERE MATCH recherche AGAINST ('$recherch')")
while($resultat=mysql_fetch_assoc($resultat1))
{
extract($resultat);
echo"id: $id<br><br>";
edit a présent j'en suis la.
<?php
include("php/connectionbd.php");
$recherch = $_POST['recherche'];
// On supprime les accents et on remplace les c en s ainsi que tout charactere speciaux
$replace=array('à','â','ä','ç','c','è','é','ê','ë','î','ï','y','ô','ö','ù','û','ü',"'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=	 array('a','a','a','s','s','e','e','e','e','i','i','i','o','o','u','u','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recherch = str_replace($replace,$by,$recherch);
//on met tout en minuscule
$recherch = strtolower($recherch);
//on supprime les doubles characteres
$recherch = preg_replace('`(.)\1`', '$1', $recherch);
//on enleve les terminaison se finissant pat "t","d","s","x"
$recherch = preg_replace( '`[tdsx] `', ' ', $recherch);
echo"$recherch";
$resultat1=mysql_query("SELECT * FROM produit WHERE MATCH recherche AGAINST ('$recherch')");
while($resultat=mysql_fetch_assoc($resultat1))
{
extract($resultat);
echo"id: $id<br><br>";
}
?>
edit resolut merci a tous