Moteur recherche php/sql

Fermé
lanuit - 27 juin 2012 à 11:37
 lanuit - 29 juin 2012 à 11:22
Bonjour,

Je voudrais faire un moteur de recherche :

une société souscris à plusieurs service.

et dans la page de recherche j'ai fait un formulaire checkbox,
pour trouver toutes les société qui ont tel service on coche les cases et on lance la recherche.

Mon problème, c'est que dans la requette sql.
si je mets
where compta = 1
and paie = 1
and autre = 0
and autre2 = 0

(toutes les services sont à 0 de base, et il y a 1 quand le service est coché)

alors si la société à d'autres modules elle serait pas prit en compte.

si je mets OR à la place de AND, alors je vais avoir toutes les société, car y aura forcément des société avec des modules à = 0

...

du coup je vois pas comment faire ça en php :/

Pouvez-vous m'aidez ?

A voir également:

14 réponses

Utilisateur anonyme
27 juin 2012 à 11:49
Bonjour

Si j'ai bien compris ton problème, il suffit de ne pas mettre and autre=0 and autre2=0

Construis ton where dans une boucle en n'incluant que les conditions cochées, au lieu de mettre au départ toutes les conditions et de leur associer 0 ou 1
2
Utilisateur anonyme
27 juin 2012 à 17:13
Non, false ce n'est pas 0 et true ce n'est pas 1.

true et false sont de booleens, 0 et 1 des nombres. Ce n'est pas la même chose.
Dans le contexte ou tu les utilises, c'est à dire pour créer un chaîne, true est bien remplacé par 1 mais false est remplacé par... rien du tout, et non pas par 0. Donc ta requête n'aurait pas du tout la tête que tu crois.

j'ai abrégé car je voulais pas faire un post trop long. Tu as bien fait, merci
2
Merci pour ta réponse.

En fait le nombre de service sélectionné est variable. donc le seul moyen que j'ai trouvé c'est de mettre tous les service dans la requête sql en mettant les "autre = 0"
0
Utilisateur anonyme
27 juin 2012 à 13:58
C'est bien ce que je te dis : ce n'est pas le bon moyen. Il ne faut pas mettre les "autre = 0", il ne faut pas mettre les "autre" du tout.
Montre ton code pour que je le modifie
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Voilà la partie de mon code avec la requête sql.

      $sql_so = $connexion->prepare("SELECT * FROM societe WHERE ess_cg LIKE '%".$mod0."%'  
                  or  ess_gb  LIKE '%".$mod1."%'  
                  or  ess_gf  LIKE '%".$mod2."%'  
                  or  ess_ga  LIKE '%".$mod3."%'  
                  or  ess_gc  LIKE '%".$mod4."%'  
                  or  ess_gp  LIKE '%".$mod5."%'  
                  or  ess_gi  LIKE '%".$mod6."%'  
                  or  ess_pro  LIKE '%".$mod7."%'  
                  or  ess_liasse  LIKE '%".$mod8."%'  
                  or  ess_tps  LIKE '%".$mod9."%'    
                  or  ess_metier  LIKE '%".$mod10."%'  
                 ");  
                   
      $sql_so->execute(array()) or die(print_r($sql_so->errorInfo()));  
      $donnees_so = $sql_so->fetch();  
0
Utilisateur anonyme
27 juin 2012 à 14:38
Où sont les = 0 ou 1 de ta requête de départ ?
Tous tes %$mod0%,%$mod1 etc.. correspondent à des checkbox ou non ? Ils peuvent valoir autre chose que 0 o u 1 ?
0
les $mod ont pour valeur 0 ou 1

Je reprends les valeur des "mod" à partir de la checkbox
voici la code où je crée les variables $mod
$i = $_POST['i']; 
if($i == 0) { 

 for ($j = 0; $j < 45; $j++) { 
 ${'mod'.$j} = false; // $mod crée 
  if(isset($_POST['mod'.$j.''])) { 
   $_POST['mod'.$j.''] = true; 
  } 
 } 

 extract($_POST); // j'extrais les $_post pour que ça devienne des $mod, et ça ecrase les anciennes valeurs 



Chaque %".$mod1."% équivaut correpond à la valeur 0 ou 1
0
D'après le code que tu viens de mettre, chaque $mod vaut true ou false, en non pas 0 ou 1.
De toutes manières, comme tu maîtrises la valeur de tes variables, pourquoi mettre un LIKE avec des % ? Ça me semble totalement absurde.

Et tu sembles initialiser $mod1 à $mod45, alors qu'il n'y a que 11 variables dans ta requête...

M'enfin...
Sans utiliser de variables intermédiaires $mod :

$tbchamps=array();    
$tbnomschamps=array('ess_cg','ess_gb','ess_gf','ess_ga','ess_gc','ess_gp','ess_gi','ess_pro','ess_liasse','ess_tps','ess_metier');    
      
for ($k=0; $k<=10; $k++) {    
  if (isset($_POST['mod'.$k])) $tbchamps[]=$tbnomschamps[$k];    
}    
$condition='';    
if (count($tbchamps)>0) $condition=" WHERE ".implode(' OR ',$tbnomschamps); // AND ou OR ? à toi de voir    
$sql_so = $connexion->prepare("SELECT * FROM societe".$condition;    
0
Merci beaucoup, je vais essayé d'appliquer ta méthode.

En ce qui concerne le code avec les $mod il y en a bien 45, j'ai abrégé car je voulais pas faire un post trop long.

concernant le 0 et 1
false = 0
true = 1
non ?
0
$tbchamps=array();    
    $tbnomschamps=array('ess_cg','ess_gb','ess_gf','ess_ga','ess_gc','ess_gp','ess_gi','ess_pro','ess_liasse','ess_tps','ess_metier', 
    'mono_cg','mono_gb', 'mono_gf', 'mono_ga', 'mono_gc', 'mono_gp', 'mono_gi', 'mono_pro', 'mono_liasse', 'mono_tps', 'mono_metier', 
    'r5_cg', 'r5_gb', 'r5_gf', 'r5_ga', 'r5_gc', 'r5_gp', 'r5_gi', 'r5_pro', 'r5_liasse', 'r5_tps', 'r5_metier', 'r20_cg', 'r20_gb',  
    'r20_gf', 'r20_ga', 'r20_gc', 'r20_gp', 'r20_gi', 'r20_pro', 'r20_liasse', 'r20_tps', 'r20_metier');     
       
    for ($k=0; $k<=45; $k++) {     
    if (isset($_POST['mod'.$k])) $tbchamps[]=$tbnomschamps[$k];     
    }        
    $condition='';     
    if (count($tbchamps)>0)  
    {  
     $condition=" WHERE ".implode(' and ',$tbnomschamps); // AND ou OR ? à toi de voir     
    } 
     
    $sql_so = $connexion->prepare("SELECT * FROM societe".$condition);    
     
    ;    


J'ai appliqué ton code,

Lorsque je mets ' OR ' toutes les société avec un service souscrit est affiché (qu'importe le service coché dans la checkbox)
et si je mets ' AND ' j'ai aucun résultat.

alors j'ai essayé de mettre la condition en faisant

$condition=" WHERE ".implode(' and ',$tbnomschamps) "='1'";

mais ça plante tout, et il m'affiche
Parse error: parse error in C:\wamp\www\repertoire\cible_recherche.php on line 613

j'ai essayé en modifié la requete sql au lieu de la variable $condition

    $sql_so = $connexion->prepare("SELECT * FROM societe".$condition "= '1'");    
    


cela me donne aussi une erreur.
En fait dans ton code original, je vois pas à quel moment tu dis "selectionner quand le service = 1"

Pourrais-tu m'éclairer, s'il te plait
0
Utilisateur anonyme
28 juin 2012 à 17:41
1 - Je ne mets pas "=1" car ce n'est pas utile. Dans la mesure où, par exemple, ess_cg et ess_gb ne peuvent valoir que 1 ou 0, il est équivalent d'écrire :
... WHERE ess_cg=1 AND ess_gb=1
ou
... WHERE ess_cg AND ess_gb

2 -
$condition=" WHERE ".implode(' and ',$tbnomschamps) "='1'";
ne peut pas marcher, il manque un point avant le "=1" et en plus ça ne fait pas ce que tu crois : ça rajoute un seul =1 à la fin de la requête, pas après chaque champ.

3 - Si le comportement est celui-ci, c'est à cause de deux erreurs combinées : je n'ai pas repris le bon tableau pour l'implode (tu aurais pu le voir toi même) et il y a 44 champs et non pas 45, donc la boucle trouve toujours qu'il manque un champ, donc c'est toujours faux avec le AND

d'où la correction :

    for ($k=0; $k<count($tbnomschamps); $k++) {     
    if (isset($_POST['mod'.$k])) $tbchamps[]=$tbnomschamps[$k];     
    }        
    $condition='';     
    if (count($tbchamps)>0)  
    {  
     $condition=" WHERE ".implode(' and ',$tbchamps); // AND ou OR ? à toi de voir     
    } 
     
0
Merci beaucoup pour ton aide, ça marche impec' !

En ce qui concerne
$condition=" WHERE ".implode(' and ',$tbnomschamps) "='1'";

j'ai testé, en sql directement

SELECT * FROM societe where ess_cg AND ess_gp = "1";
et ça me donne le même résultat que

SELECT * FROM societe where ess_cg = "1" AND ess_gp = "1";

j'en ai conclue que les 2 méthodes se valent.
0
Utilisateur anonyme
28 juin 2012 à 21:21
que les 2 méthodes se valent.
Bien sûr puisque ess_cg est équivalent à ess_cg=1
Toujours dans la mesure où ess_cg ne peut valoir que 0 ou 1.
Mais c'est un peu absurde de ne pas mettre =1 sur tous les champs sauf le dernier.
0
en effet ^^
0