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 :D 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.