Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/06/2011, 21h39   #1
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
Par défaut Recherche par pertinence PostgreSQL

Bonsoir,

Je fais mes débuts avec PostgreSQL et je dois réaliser un petit moteur de recherche pour les articles de mon site.
Pour chercher le titre, j'ai pensé à utiliser la recherche plein texte.

Voici ce que j'ai rapidement codé :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
IF((isset($_POST['RechercherArticle'])) && (!empty($_POST['Titre']) || !empty($_POST['Categorie']) || !empty($_POST['Periode']) || !empty($_POST['Sexe']) || !empty($_POST['Age']) || !empty($_POST['Licence'])))
{
	$sql	=	"SELECT membre.id_membre, article.id_article, titre_article, SUBSTR(contenu_article, 0, 400) AS contenu, 
						parution_article, vignette_article, pseudo_membre, COALESCE(com.nbcommentaire, 0) AS nbcom, COALESCE(note.nbavis, 0) AS nbav
				FROM	article
				JOIN	membre ON membre.id_membre = article.id_membre
				LEFT OUTER JOIN(
					SELECT COUNT(*) AS nbcommentaire, id_article FROM commentaire GROUP BY id_article 
				) AS com
				ON com.id_article = article.id_article
				LEFT OUTER JOIN(
					SELECT COUNT(*) AS nbavis, id_article FROM note_article GROUP BY id_article
				) AS note
				ON note.id_article = article.id_article
				WHERE ";
 
	IF(!empty($_POST['Titre']) || !empty($_POST['Categorie']) || !empty($_POST['Periode']) || !empty($_POST['Sexe']) || !empty($_POST['Age']) || !empty($_POST['Licence']))
	{
		IF(!empty($_POST['Titre'])){ 				$sql .= "to_tsvector('french', titre_article) @@ to_tsquery('french', '".SecuBDD($_POST['Titre'])."')"; }
		IF(!empty($_POST['Categorie'])){		 	$sql .= "categorie_article = ".SecuBDD($_POST['Categorie'])." AND "; }
		IF(!empty($_POST['Periode'])){ 				$sql .= "periode_article = ".SecuBDD($_POST['Periode'])." AND "; }
		IF(!empty($_POST['Sexe'])){ 				$sql .= "sexe_article = ".SecuBDD($_POST['Sexe'])." AND "; }
		IF(!empty($_POST['tranche_age_article'])){ 	        $sql .= "sexe_article = ".SecuBDD($_POST['Age'])." AND "; }
		IF(!empty($_POST['Licence'])){ 				$sql .= "licence_article = ".SecuBDD($_POST['Licence'])." AND "; }
 
		$sql					=	substr($sql, 0, -5);
		// $RechercheArticle		=	pg_query($sql);
		echo $sql;
	}
}
Je test avec le mot "Premier" :

Voici la requête générée :

Citation:
SELECT membre.id_membre, article.id_article, titre_article, SUBSTR(contenu_article, 0, 400) AS contenu, parution_article, vignette_article, pseudo_membre, COALESCE(com.nbcommentaire, 0) AS nbcom, COALESCE(note.nbavis, 0) AS nbav
FROM article
JOIN membre ON membre.id_membre = article.id_membre
LEFT OUTER JOIN( SELECT COUNT(*) AS nbcommentaire, id_article FROM commentaire GROUP BY id_article ) AS com ON com.id_article = article.id_article
LEFT OUTER JOIN( SELECT COUNT(*) AS nbavis, id_article FROM note_article GROUP BY id_article ) AS note ON note.id_article = article.id_article
WHERE to_tsvector('french', titre_article) @@ to_tsquery('french', 'Prem
Voici le message d'erreur :

Citation:
Warning: pg_query() [function.pg-query]: Query failed: ERREUR: chaîne entre guillemets non terminée sur ou près de « 'Prem » LINE 13: ...ector('french', titre_article) @@ to_tsquery('french', 'Prem ^ in E:\EasyPHP\www\ExposePG\articles.php on line 321
J'ai du mal à comprendre pourquoi le mot recherché, n'est pas affiché en entier et comme résoudre l'erreur.

Merci à vous.
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 22h28   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 507
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 507
Points : 2 039
Points : 2 039
C'est plus une question php que postgres mais cette ligne
Code :
 $sql					=	substr($sql, 0, -5);
supprimant les 5 derniers caractères de la phrase SQL, on peut imaginer que la phrase SQL résultante est invalide. Ce qu'on imagine moins c'est à quoi ce code peut servir?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 12h40   #3
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
Bonjour,

Effectivement l'erreur vient de là, j'avais complétement oublié le substr.
Pour information, ce bout de code permet de supprimer le AND à la fin de la requête.

Ce script permet de sélectionner les articles selon plusieurs critères au choix.

Affaire résolu :
Code :
$sql .= "to_tsvector('french', titre_article) @@ to_tsquery('french', '".SecuBDD($_POST['Titre'])."') AND ";
Merci de m'avoir aider !

Le moteur de recherche, fonctionne avec un seul terme.
Quand je test avec deux termes, j'ai cette erreur :

Citation:
Warning: pg_query() [function.pg-query]: Query failed: ERREUR: erreur de syntaxe dans tsquery : « Premier article » in E:\EasyPHP\www\ExposePG\articles.php on line 323
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 18h45   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Le moteur de recherche, fonctionne avec un seul terme.
Quand je test avec deux termes, j'ai cette erreur :

Postez votre requête générée avec deux critères que nous puissions vous aider...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 19h25   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 507
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 507
Points : 2 039
Points : 2 039
Il faut utiliser plainto_tsquery() au lieu de to_tsquery() si c'est pour lui passer une chaine qui ne soit pas déjà préformatée.
Concrètement, plainto_tsquery('french', 'terme1 terme2') devrait être équivalent à to_tsquery('french', 'terme1 & terme2')
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 20h49   #6
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
Merci, problème résolu !
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h12.


 
 
 
 
Partenaires

Hébergement Web