IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème de boucle Switch Case


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de mLk92
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 527
    Points : 305
    Points
    305
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre habitué
    Homme Profil pro
    Mickaël
    Inscrit en
    Mai 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Mickaël
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2003
    Messages : 106
    Points : 133
    Points
    133
    Par défaut
    Salut,

    Je ferai un truc dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    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...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. instruction pour boucle switch case
    Par aymench1985 dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/03/2015, 23h46
  2. La francisation de la boucle Switch case
    Par fasfousba dans le forum Débuter
    Réponses: 4
    Dernier message: 22/12/2009, 12h18
  3. Problème avec un switch/case
    Par Lolitaaa dans le forum Général Java
    Réponses: 2
    Dernier message: 10/12/2009, 22h33
  4. Une boucle for dans un switch case?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 14h05
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo