match against avec recherche nule

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : match against avec recherche nule

Re: match against avec recherche nule

par Mazarini » 20 juin 2012, 11:34

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.

Re: match against avec recherche nule

par charly92 » 19 juin 2012, 17:01

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

par charly92 » 19 juin 2012, 16:56

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

par Mazarini » 19 juin 2012, 16:26

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

par charly92 » 19 juin 2012, 15:05

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

par Mazarini » 19 juin 2012, 13:47

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.

match against avec recherche nule

par charly92 » 19 juin 2012, 11:17

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.