Page 1 sur 1
match against avec recherche nule
Posté : 19 juin 2012, 11:17
par charly92
Bonjour,
je fais un moteur de recherche avec plusieurs mots clés en php/sql. Après avoir parcouru les forums j'ai choisis le Fulltext.
J'ai donc (pour l'instant) 4 champs de recherche. Cependant à chaque recherche tous ces champs ne sont pas forcément remplis.
Ce code fonctionne, mais si un champ n'est pas remplis ça ne fonctionne pas:
Code : Tout sélectionner
SELECT * FROM commandes,client WHERE commandes.ID_CLIENT=client.CODE_CLIENT AND MATCH (Num_SAP)
AGAINST ('+$rechercheSAP*' IN BOOLEAN MODE) AND MATCH(commune_nom) AGAINST ('+$recherchecom*' IN BOOLEAN MODE)
AND MATCH(Num_Cde) AGAINST ('+$recherchecommande*' IN BOOLEAN MODE) AND MATCH(NUM_DEVIS) AGAINST ('+$recherchedevis*' IN BOOLEAN MODE);
J'aimerais donc savoir si ce code est approprié pour ce que je veux faire. J'ai lu qu'il n’était pas recommandé d'utiliser la fonction LIKE et grâce à MATCH AGAINST il y a la pertinence de la recherche. Et si c'est bien cette fonction qu'il faut utiliser, comment résoudre mon problème?
Merci.
Re: match against avec recherche nule
Posté : 19 juin 2012, 13:47
par Mazarini
Tu peux constituer un tableau de condition avec chaque test si la valeur est renseignée.
Tu fais un implode de ce tableau avec ' and ' pour la liaison et tu ajoute le "select ... where commandes.ID_CLIENT=client.CODE_CLIENT and " devant.
Il faut vérifier qu'il y a bien au moins une condition sinon le and ne sera suivi de rien.
Re: match against avec recherche nule
Posté : 19 juin 2012, 15:05
par charly92
Ah ben merci beaucoup

j'avais pas pensé a cette astuce
Code : Tout sélectionner
if(!empty($rechercheSAP))
{$tableau[]=" MATCH (Num_SAP) AGAINST ('+$rechercheSAP*' IN BOOLEAN MODE)";
}
if(!empty($recherchecom))
{$tableau[]=" MATCH(commune_nom) AGAINST ('+$recherchecom*' IN BOOLEAN MODE)";
}
if(!empty($recherchecommande))
{$tableau[]=" MATCH(Num_Cde) AGAINST ('+$recherchecommande*' IN BOOLEAN MODE)";
}
if(!empty($recherchedevis))
{$tableau[]=" MATCH(NUM_DEVIS) AGAINST ('+$recherchedevis*' IN BOOLEAN MODE)";
}
$tab=implode('AND ',$tableau);
$sql="SELECT * FROM commandes,client WHERE commandes.ID_CLIENT=client.CODE_CLIENT AND $tab;";
je n'ai pas fais des centaines de tests parce que ma base de donnée n'est pas encore complété. Mais est-ce qu'il peut y avoir une erreur dans certains cas? ( à part si aucun champ n'est remplis bien sûr)
Re: match against avec recherche nule
Posté : 19 juin 2012, 16:26
par Mazarini
Lorsqu'aucun critère est alimenté :
Il faut initialiser $tableau[] = array() avant le premier test
et faire un traitement différent si count($tableau)==0 pour la génération du select et l'implode()
Re: match against avec recherche nule
Posté : 19 juin 2012, 16:56
par charly92
hmmm je pense avoir compris. J'ai modifié:
Code : Tout sélectionner
<?php
$tableau[]=array();
if(!empty($rechercheSAP))
{ $tableau[]=" MATCH (Num_SAP) AGAINST ('+$rechercheSAP*' IN BOOLEAN MODE)";
}
if(!empty($recherchecom))
{$tableau[]=" MATCH(commune_nom) AGAINST ('+$recherchecom*' IN BOOLEAN MODE)";
}
if(!empty($recherchecommande))
{$tableau[]=" MATCH(Num_Cde) AGAINST ('+$recherchecommande*' IN BOOLEAN MODE)";
}
if(!empty($recherchedevis))
{$tableau[]=" MATCH(NUM_DEVIS) AGAINST ('+$recherchedevis*' IN BOOLEAN MODE)";
}
if(empty($tableau))
{
$tab=implode('AND ',$tableau);
$sql="SELECT * FROM commandes,client WHERE commandes.ID_CLIENT=client.CODE_CLIENT AND $tab;";
}
else
{
$sql="select * FROM commandes, client where commandes.ID_CLIENT=client.CODE_CLIENT;";
}
?>
C'est correct à présent?
En tout cas je te remercie de m'avoir trouver la solution et de me corriger

c'est très sympa!
Re: match against avec recherche nule
Posté : 19 juin 2012, 17:01
par charly92
Finalement empty ne marche pas, c'est plutôt isset ! J'avoue ne pas faire la différence :S
Re: match against avec recherche nule
Posté : 20 juin 2012, 11:34
par Mazarini
En fait, tu utilises le tableau quand... il est vide : Inverse le code entre le if et le else.
Fait une echo du code sql pour vérifier les blancs, mais c'est juste pour pinailler.