Moteur de recherche site d'annonce

Nriem
Invité n'ayant pas de compte PHPfrance

07 nov. 2013, 02:49

Bonjour,

J'ai besoin de crée un moteur de recherche qui va chercher des annonce dans une base de donner,
J'ai un formulaire avec un champs "recherche" et un autre champs "code postal"
J'ai besoins de faire ma recherche dans 3 entrés de ma table "annonceEnLigne"
1er) titreAnnonce
2) descriptionObjet.
Et le 3ème entres, pour le form "code postal"
(Qui et pas obligatoire pour la recherche)
"codePostal".

J'ai chercher des tuto sur google j'ai pas trouver un, que je peu adapter à mes besoin

Donc j'aurai aimer si on peu me dire si c'est possible de faire sa que avec un LIKE ou un LIKE C'est pas assez performant?
Ou si il faut faire sa avec un FULL TEXT ?
Si quelqu'un a un tutoriels sur comment sa marche FULL TEXT je suis preneur

Merci de m'avoir lu, j'espère avoir était Claire.

Mammouth du PHP | 504 Messages

07 nov. 2013, 10:43

Slt,

tout est dans ta question (coté technique). Je pense que tu n'as pas testé sinon tu aurais vu que ça marche trés bien avec des LIKE. :wink:

Tu fais un formulaire avec une méthode get par ex: 3 input, 1 pour chaque objet de recherche.

Tu recupere tes get dans ta requete sql avec par ex:
WHERE titreAnnonce LIKE '%motrecherche%' AND descriptionObjet LIKE '%descriprecherche%' AND code postal LIKE '%cprecherche%'
Coté performance, afin d'améliorer la vitesse de résultat, il est vivement conseillé de créer des INDEX sur les champs où tu opéres ta recherche dans ta BDD. DE plus, je te conseille de ne retourner seulement le nombre de résultat dont tu as besoin pour ton affichage, c'est à dire que si tu ne veux en afficher que 10, ajoute la clause LIMIT 10 à ta requete sql. il ne sert a rien de prendre plus que neccessaire dans le traitement.

nriem
Invité n'ayant pas de compte PHPfrance

07 nov. 2013, 23:45

Merci pour ta réponse.

si j'ai tester, :wink:
comme tu dit la recherche elle marche bien mai seulement pour le premier champs "recherche"
(que si on tape un mot qui figure dans le titre ou dans la description sa affiche l'annonce)

mai des que je rentre un code postale (ou même une catégorie) sa affiche pas les annonce seulement de se code postal (ou de cette catégorie)
(même si c'est 2 dernier champs il sont pas obligatoire).

désoler de ne pas l’avoir préciser dans mon premier poste, mai c'est sur se point mon problème.

y'a un autre (petit) souci c'est que si on tape plusieurs MOT (dans la recherche) et seulement un SEUL mot ne figure pas dans la base, sa affiche rien.

voila mon code (j'ai mi POST je pense c'est plus sécuriser)
if(isset($_POST['recherche']) AND $_POST['recherche'] == TRUE)
{
 if(isset($_POST['gategorie']) AND $_POST['gategorie'] == TRUE OR empty($_POST['gategorie']))
    {
    if(isset($_POST['codePostal']) AND $_POST['codePostal'] == TRUE OR empty($_POST['codePostal']))
	{
						
	      $recherche = htmlspecialchars(trim($_POST['recherche']));
	      $gategorie = htmlspecialchars(trim($_POST['gategorie']));
	      $codePostal = htmlspecialchars(trim($_POST['codePostal']));
							
		include ('dbconnect.php'); // conexion a la BDD
	
$req = $bdd->prepare("SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
 FROM annonceEnLigne
 WHERE titreAnnonce LIKE '%$recherche%' OR descriptionObjet LIKE '%$recherche%' 
 AND gategorie LIKE '%$gategorie%' AND codePostal LIKE '%$codePostal%' ");
 $req->execute();
											
$donnees = $req->fetchAll(); 

}
  }
     }

j'ai pas très bien compris pour les INDEX je doit les rajout dans phpmyadmin !? c'est AUTO INCREMENT ou aucun rapport?

MERCI pour le LIMITE j'ai penser, je compte faire une pagination de page

merci d'avance pour ta réponse

Mammouth du PHP | 504 Messages

08 nov. 2013, 00:33

slt,

Reprend la doc mysql sur les clauses WHERE 'OR' et 'AND'.
SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
FROM annonceEnLigne
WHERE titreAnnonce LIKE '%$recherche%' 
OR descriptionObjet LIKE '%$recherche%' 
AND gategorie LIKE '%$gategorie%' 
AND codePostal LIKE '%$codePostal%'
ta requète écrite comme ceci suppose que toute les conditions doivent etre rempli pour que ta requete soit fonctionnelle.

si tu écris:
 gategorie LIKE '%1%' AND codePostal LIKE '%1%' 
. les deux conditions doivent etre remplis. si l'une ou l'autre n'est pas rempli la requete n'abouti pas. C'est le principe du AND.

rajoute des parenthese et vu que ta requete contient des éléments non obligatoire, je la découperai comme suit:
$requete = "SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
FROM annonceEnLigne
WHERE (titreAnnonce LIKE '%$recherche%' OR descriptionObjet LIKE '%$recherche%')";
if(!empty ($_GET['gategorie'])) {
$requete. ="AND gategorie LIKE '%$gategorie%'";
}
if(!empty ($_GET['gategorie'])) {
$requete. ="AND codePostal LIKE '%$codePostal%'";
}

nriem
Invité n'ayant pas de compte PHPfrance

08 nov. 2013, 01:33

merci

je s'avais pas, qu'on pouvais rajouter des information sur une requête SQL.

mai il y'a une ERREUR

( ! ) Parse error: syntax error, unexpected '=' in C:.....php on line 71


j'ai fait la même choses que toi a priorie
 
if(!empty($_POST['gategorie']))
{
       $req. = "AND gategorie LIKE '%$gategorie%' " ; // ligne 71
}
if(!empty($_POST['codePostal']))
{
      $req. = "AND codePostal LIKE '%$codePostal%' " ;
}
       $req->execute();
a pare sa tu ma pas répondu pour l'INDEX
et ma mon deuxième (petit) problème

merci encore pour ton aide

Nriem
Invité n'ayant pas de compte PHPfrance

11 nov. 2013, 19:58

UP

Eléphant du PHP | 77 Messages

11 nov. 2013, 20:03

Pffff....

En php une concaténation .= n'a pas d'espace.

Donc il faut écrire:
if(!empty($_POST['gategorie']))
{
       $req .= "AND gategorie LIKE '%$gategorie%' " ; // ligne 71
}
if(!empty($_POST['codePostal']))
{
      $req .= "AND codePostal LIKE '%$codePostal%' " ;
}
       $req->execute();
Depuis le 8 novembre, tu cours après ça ???????


Note: il existe des logiciels (et gratuit comme Eclipse par exemple) sui vont indiquent quand il y a des erreurs de syntaxe et où elles se trouvent...
Développeur PHP/Javascript/HTML

Mes sites perso :
construire une piscine => http://www.construire-sa-piscine.com
Le cadre végétal => http://www.cadre-vegetal.org

nriem
Invité n'ayant pas de compte PHPfrance

12 nov. 2013, 03:02

Merci franckm

mai j'ai toujours une ERREUR (pas la même)

( ! ) Catchable fatal error: Object of class PDOStatement could not be converted to string in C


Citation: Depuis le 8 novembre, tu cours après ça ???????

je cours pas je marche lol
t’inquiète pas, j'ai pas que sa a faire je passe a autre choses quand je vois qu'on me répond pas

Eléphant du PHP | 77 Messages

12 nov. 2013, 07:57

je passe a autre choses quand je vois qu'on me répond pas
Ou tu pourrais essayer de trouver la réponse par toi même...

Un forum c'est là pour aider pas pour mâcher le travail ;)
Développeur PHP/Javascript/HTML

Mes sites perso :
construire une piscine => http://www.construire-sa-piscine.com
Le cadre végétal => http://www.cadre-vegetal.org

Nriem
Invité n'ayant pas de compte PHPfrance

12 nov. 2013, 20:48

Ou tu pourrais essayer de trouver la réponse par toi même...

Un forum c'est là pour aider pas pour mâcher le travail ;)
Je peu t'assurer que si j'avais trouver la réponses (ou un tuto) moi même j'aurai pas demander de l'aide sur le forum :non:

Si tu a bien lu mon premier message je demande pas qu'on me donne le code d'un formulaire de recherche sur un plateaux,
Mai un CONSEILLE plutôt ou un tuto (bien expliquer) sur un moteur de recherche

Se qui devrait pas être très compliquer à répondre (pour des pro en php) puisque c'est quelque choses qui et quasiment dans tout les site aujourd'hui

Bref si personne veut répondre on va essayer de se débrouiller autrement :wink:

Merci qu'en même

Eléphant du PHP | 77 Messages

12 nov. 2013, 21:12

Déjà:

1. J'ai répondu à ta question qui était sur ta dernière erreur en date à savoir .= au lieu de . =
Et oui excuses moi encore mais si tu avais cherché un peu en bidouillant toi même (c'est aussi comme ça qu'on apprend) tu aurais certainement trouvé avant.

Bref, il y certainement un problème dans ton code par rapport au nom des variables. dans tes premiers posts, tu écrirs $req= $bdd->... , c'est à dire que $req est l'objet PDO préparé et ensuite plus bas tu mets $req comme étant une concaténation de ta requête. Donc en essayant de reprendre ton code, essaies ça:
//Je commence par construire ma requête avec mes clauses
$lRequete = "SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
FROM annonceEnLigne
WHERE (titreAnnonce LIKE '%$recherche%' OR descriptionObjet LIKE '%$recherche%')";
if(!empty($_POST['gategorie'])){
       $lRequete .= " AND gategorie LIKE '%$gategorie%' " ; // ligne 71
}
if(!empty($_POST['codePostal'])){
      $lRequete .= " AND codePostal LIKE '%$codePostal%' " ;
}

//Je prépare la requête
$lSql= $bdd->prepare($lRequete);

//J'exécute la requête et je récupère les fetch
$lSql->execute();
$lDonnees = $lSql->fetchAll(); 
Développeur PHP/Javascript/HTML

Mes sites perso :
construire une piscine => http://www.construire-sa-piscine.com
Le cadre végétal => http://www.cadre-vegetal.org

Nriem
Invité n'ayant pas de compte PHPfrance

12 nov. 2013, 22:54

sa marche nickel =D> Merci beaucoup

Je me douter que le problème venait de la requête préparer,
Mai qu'en j'ai appris le PHP on m'a pas enseigner qu'on pouvait préparer la requête après l'avoir crée, (en restent sécuriser)

Et c'est d'ailleurs pour sa que j'ai placer le
$req->execut();
Après les 2 condition en pensent que temps que la requête n'est pas exécuter on peu la concatenes
(Je suis seulement un simple débutent en PHP :wink: )

Merci encore

Nriem
Invité n'ayant pas de compte PHPfrance

12 nov. 2013, 22:58

Sans trop te déranger et si t'a du temps

J'ai une autre question

Comment résoudre se problème

si on tape plusieurs MOT (dans la recherche) et seulement un SEUL mot, ne figure pas dans la base, sa affiche rien
Même si dans c'es plusieurs mot taper y'avais des mot qui figure dans la BDD

Merci d'avance

Eléphant du PHP | 77 Messages

12 nov. 2013, 23:33

Là c'est un peu plus compliqué.

Tu récupères de ton formulaire un champs texte nommé recherche. Si j'ai bien compris on peut taper ce qu'on veut dans ce texte et toi tu veux que dès qu'un mot se trouve dans un titre ou une description tu l'affiches.

Donc ici il va falloir commencer par séparer tous les mots du champs recherche pour en faire chacunes des valeurs à tester. Moi je commencerais par enlever de la chaîne recherche toutes les virgules, points, chiffres, caractères spéciaux...
Pour cela il faudra certainement utiliser une expression régulière. Commençons simple en disant qu'on enlève tous les points et virgules.
$lRecherche = str_replace(array(',', '.'), '', $_POST['recherche']);
Ensuite il faut splitter la chaîne par rapport aux espaces laissés pour récupérer tous les mots.
$lTabRecherche = explode(' ', $lRecherche);
Tu obtiens alors un tableau à n éléments, n étant le nombre de mots dans la chaîne.

C'est là que ça devient un peu lourdingue, il va falloir faire un foreach pour lister tous les éléments du tableau et rajouter une condition LIKE sur chaque élément.
//On initialise notre variable comme un string
$lSqlRecherche = '';
//On liste les éléments du tableau
foreach($lTabRecherche AS $lOneTab){
      //Pour chaque élément, on concatène notre sql
     //A la première itération on ne met pas OR on le met seulement à partir de la deuxième
     if($lKey > 0){
		$lSqlRecherche .= "OR";
      }
      $lSqlRecherche .= " titreAnnonce LIKE '%$lOneTab%' OR descriptionObjet LIKE '%$lOneTab%'  ";   
}
On a alors notre condition sur la recherche, on peut l'insérer dans la requête:
//Je commence par construire ma requête avec mes clauses
$lRequete = "SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
FROM annonceEnLigne
WHERE ( $lSqlRecherche )";
if(!empty($_POST['gategorie'])){
       $lRequete .= " AND gategorie LIKE '%$gategorie%' " ; // ligne 71
}
if(!empty($_POST['codePostal'])){
      $lRequete .= " AND codePostal LIKE '%$codePostal%' " ;
}

//Je prépare la requête
$lSql= $bdd->prepare($lRequete);

//J'exécute la requête et je récupère les fetch
$lSql->execute();
$lDonnees = $lSql->fetchAll();
 
Ci dessous le code dans globalité:
//On enlève les virgules et les points
$lRecherche = str_replace(array(',', '.'), '', $_POST['recherche']);
//On explose notre chaîne sur les espaces
$lTabRecherche = explode(' ', $lRecherche);
//On initialise notre variable sql comme un string
$lSqlRecherche = '';
//On liste les éléments du tableau
foreach($lTabRecherche AS $lKey => $lOneTab){
	//Pour chaque élément, on concatène notre sql
	//A la première itération on ne met pas OR on le met seulement à partir de la deuxième
	if($lKey > 0){
		$lSqlRecherche .= "OR";
	}
	$lSqlRecherche .= " titreAnnonce LIKE '%$lOneTab%' OR descriptionObjet LIKE '%$lOneTab%' ";
}
//Je commence par construire ma requête avec mes clauses
$lRequete = "SELECT id, titreAnnonce, gategorie, photoObjet, prix, codePostal, ville, descriptionObjet
FROM annonceEnLigne
WHERE ( $lSqlRecherche )";
if(!empty($_POST['gategorie'])){
	$lRequete .= " AND gategorie LIKE '%$gategorie%' " ;
}
if(!empty($_POST['codePostal'])){
	$lRequete .= " AND codePostal LIKE '%$codePostal%' " ;
}

//Je prépare la requête
$lSql= $bdd->prepare($lRequete);

//J'exécute la requête et je récupère les fetch
$lSql->execute();
$lDonnees = $lSql->fetchAll();
A tester pour voir si ça marche...
Modifié en dernier par franckm le 12 nov. 2013, 23:39, modifié 2 fois.
Développeur PHP/Javascript/HTML

Mes sites perso :
construire une piscine => http://www.construire-sa-piscine.com
Le cadre végétal => http://www.cadre-vegetal.org

ViPHP
ViPHP | 2577 Messages

12 nov. 2013, 23:35

http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

Ca me semble pas mal comme doc. Les fonctions utilisées ressemblent plus à un moteur de recherche que les likes.

Pour les catégories et les codes postaux; utilises plutôt des = que des like. Eventuellement prévois plusieurs catégories et plusieurs code postaux (ou tout un département). Tu peux aussi utiliser un truc genre "catégorie in (21,43, 62)" idem pour les cp.