Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
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 13/06/2007, 17h37   #1
Membre confirmé
 
Avatar de mLk92
 
Inscription : mars 2006
Messages : 522
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 522
Points : 249
Points : 249
Par défaut Problème de boucle Switch Case

Hi all,

Je cherche à faire un formulaire de recherche, mais je rencontre un problème avec 3 checkbox.

Je voudrais faire une requête selon la ou les checkbox sélectionner, donc g fais une boucle Switch/case :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch($typeBoat)
	{
	 case mono:
		 $query="SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull FROM boat WHERE hull LIKE '%mono%' AND basedepus LIKE '%".$userZone."%' ORDER BY loa DESC";
		 break;
	 case cata:
		 $query="SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull FROM boat WHERE hull LIKE '%cata%' AND basedepus LIKE '%".$userZone."%' ORDER BY loa DESC";
		 break;
	case motoryacht:
		$query="SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull FROM boat WHERE hull LIKE '%motoryacht%' AND basedepus LIKE '%".$userZone."%' ORDER BY loa DESC";
		  break;
	 default:
		 $query="SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull FROM boat WHERE (hull LIKE '%mono%' OR hull LIKE '%cata%' OR hull LIKE '%motoryacht%') AND basedepus LIKE '%".$userZone."%' ORDER BY loa DESC";
		 break;
}
Là je ne gère que le cas ou seulement une est sélectionnée.

Comment faire pour gérer les cas où 2 d'entre elles ou les Trois ensembles sont sélectionnées ?

Merci pour vos réponses !
__________________
Citation:
" Can't take your slogans no more, no more sweet talk from the hypocrits " by Robert Nesta Marley
mLk92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2007, 21h43   #2
Membre régulier
 
Avatar de mikyfpc
 
Développeur .NET
Inscription : mai 2003
Messages : 96
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mai 2003
Messages : 96
Points : 74
Points : 74
Envoyer un message via MSN à mikyfpc
Salut,

Je ferai un truc dans ce style :

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
 
$query = "SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull FROM boat WHERE ";
$where = "";
 
if($typeBoatMono) 
{
  if( $where != "" ) $where .= "AND ";
  $where .= " hull LIKE '%mono%' ";
}
 
if($typeBoatCata)  
{
  if( $where != "" ) $where .= " AND ";
  $where .= " hull LIKE '%cata%' "; 
}
 
if($typeBoatMotor) 
{
  if( $where != "" ) $where .= " AND ";
  $where .= " hull LIKE '%motoryacht%' ";
}
 
if ($where == "" )
{
$where="(hull LIKE '%mono%' OR hull LIKE '%cata%' OR hull LIKE '%motoryacht%') ";
}
 
 
$where .= " AND basedepus LIKE '%".$userZone."%' ORDER BY loa DESC";
$query .= $where;

Si tes case à cocher ont des noms différentes, tu dois pouvoir récupérer la valeur de chacune d'elles

Mickaël
__________________
MyFinder, explorateur de fichiers alternatif
http://myfinder.fpc-france.com

SimplyMirror, sauvegarde simple et efficace
http://simplymirror.fpc-france.com
mikyfpc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 09h00   #3
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 686
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 686
Points : 5 451
Points : 5 451
Bonjour

Tu peux utiliser un switch avec des continue à la place des break. Sauf erreur de ma part, cela permet de tester les autres case. En revanche il faudra faire attention à ne pas remplacer les valeurs...
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 09h36   #4
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Je ne sais pas si j'ai bien compris ton problème, mais je vais remonter en amont de ta question.

Pourquoi faire une recherche sur des libellés alors qu'il est beaucoup plus simple de le faire sur des clés ?

Tu devrais avoir :
table 'zone'
  • id_zone
  • nom_zone
table 'type'
  • id_type
  • nom_type
et les colonnes 'basedepus' et 'hull' contiendraient les id de leur table respective.

Ce qui permet au final d'avoir un code simple. Exemple :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
  if ((isset($_POST['btn'])) && (isset($_POST['typeboat'])) && (isset($_POST['userzone'])))
  {
    $userZone = $_POST['userzone'];
    $typeboat = $_POST['typeboat'];
 
    $query = 'SELECT ID, name, cabines, pers, loa, motorisation, basedepus, hull
              FROM boat
              WHERE basedepus IN (' . implode(',', $userZone) . ')
              AND hull IN (' . implode(',', $typeboat) . ')
              ORDER BY loa DESC';
    echo $query;
  }
?>
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Titre</title>
		<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1" />
  </head>
	<body>
	  <form name="selection" method="post" action="">
      <table width="30%" align="center" border="0">
        <tr>
          <td colspan="2" align="center">Port d'attache</td>
        </tr>
        <tr>
          <td>France</td>
          <td>
            <input type="checkbox" name="userzone[]" value="1" />
          </td>
        </tr>
        <tr>
          <td>Japon</td>
          <td>
            <input type="checkbox" name="userzone[]" value="2" />
          </td>
        </tr>
        <tr>
          <td>Allemagne</td>
          <td>
            <input type="checkbox" name="userzone[]" value="3" />
          </td>
        </tr>
        <tr>
          <td colspan="2" align="center">Type de coque</td>
        </tr>
        <tr>
          <td>mono</td>
          <td>
            <input type="checkbox" name="typeboat[]" value="1" />
          </td>
        </tr>
        <tr>
          <td>cata</td>
          <td>
            <input type="checkbox" name="typeboat[]" value="2" />
          </td>
        </tr>
        <tr>
          <td>motoryacht</td>
          <td>
            <input type="checkbox" name="typeboat[]" value="3" />
          </td>
        </tr>
        <tr>
          <td colspan="2" align="center">
            <input type="submit" name="btn" value="valider" />
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>
Ceci avec toutes les réserves qui s'imposent, car je ne connais ni ton projet, ni les contraintes éventuelles.
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 17h20   #5
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Bonjour déjà il y a une petite erreur dans le switch, lorsque tu veut tester la variable avec une chaîne de caractère, met la entre guillemets pour éviter les conflits et erreurs. Sinon en ce qui concerne le mot-clé continue il permet en effet de relancer la boucle en cours depuis le début et le mot-clé switch est interprété comme une boucle par PHP, mais cela n'avancerai en rien car ta variable $typeBoat est fixe donc même si tu recommence la boucle il fera la même chose.
Donc ton formulaire est constitué de trois checkbox qui sont des balises INPUT :o ( on va les appeller choix1, choix2 et choix3 ), aussi met comme attribut value les noms que tu souhaites tester par la suite et dernière précision si tu donne le même nom à plusieur CheckBox alors l'utilisateur ne pourra en choisir qu'une parmis le groupe créer. Ensuite tu créer un tableau s'il y a plusieur choix séléctionnés pour le parcourir et effectuer plusieurs switch, donc il te faut aussi changer le nom de la variable pour le résultat de la requête.
Essaye donc ceci :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
<!-- Formulaire de choix -->
<form action="mapage.php" method="post">
<input type="checkbox" name="choix1" value="mono">Mono</input>
<input type="checkbox" name="choix2" value="cata">Cata</input>
<input type="checkbox" name="choix3" value="motoryacht">MotorYacht</input>
<input type="submit" name="submitBoatChoice" value="Rechercher" />
</form>
<?php
//Code PHP pour tester le formulaire et créer le tableau des choix
if ( isset($_POST['submitBoatchoice']) )
{
   $j=0;//Compteur pour le tableau des choix
 
   for ( $i=1; $i<4; $i++ )
   {
      //On test ici l'existence des trois checkbox
      $choiceString = 'choix'.$i;
      if ( isset($_POST[$choiceString]) )
      {
         //Affectation dans le tableau et post-incrementation de $choices.
         $choices[$j++] = $_POST[$choiceString];         
      } //End if
   } //End for
 
   /*Si les trois choix sont sélectionnés alors on re-modifie de manière à
   parcourir une seule fois la prochaine boucle*/
   if ( count($choices) == 3 )
   {
       $choices = array(); //Vidange de la variable
       $choices[0] = 'default';
   } //End if
 
for ( $i=0; $i<count($choices); $i++ )
{
   switch($choices[$i])
   {
       case 'mono' :
                        $monoquery = //Requete....
                        continue 2; //On retourne au début du FOR
       case 'cata'  :
                        $cataquery = //Requete....
                        continue 2;
       case 'motoryacht' :
                        $motoryachtquery = //Requete....
                        continue 2;
       case default :
                        $allquery = //Requete....
                        continue 2;
   }//End switch
}//End for
}//End if
/*Ensuite tu dois tester si tu $allquery existe, sinon tu aura alors deux 
requêtes maxi à gérer.*/
Pour le continue :o le nombre 2 va lui indiquer de remonter de deux niveaux dans la hiérarchie des boucles, il recommencera alors à partir du FOR.
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h32.


 
 
 
 
Partenaires

Hébergement Web