Partage
  • Partager sur Facebook
  • Partager sur Twitter

Checkboxes et traitement php

    23 septembre 2021 à 10:38:06

    Bonjour à tous

    Voilà j'ai une petite une requete toute simple qui me permet d'affiché des données selon une ville de renseignée, pas de soucis.

    Maintenant je souhaite rajouté des checxboxes afin de filtrer les résultats, sachant que par defaut toutes les checkboxes doivent être cochées puis une fois le choix fait affiché uniquement celle coché ou décochées.

    Requete actuelle:

               // Protection des variables passé en POST => htmlspecialchars       
               $ville = htmlspecialchars(ucfirst(strtolower($_GET['ville'])));
    
               $sql = 'SELECT * FROM sorties WHERE ville = :ville'; 
               $sql = $bdd->prepare($sql);
               $sql->bindParam(':ville', $ville, PDO::PARAM_STR);
               $sql->execute();
               var_dump($sql);


    Ma liste de checkbocxes: ( mais j'aimerais faire en sorte que cela vien directement de ma base de donnée)

           <label class="container_check">Art & Culture <small>12</small>
                                                <input type="checkbox" name="choix[]" <?php echo ((!isset($_POST['choix']))?'':'checked="checked"'); ?> value="Art & Culture">
                                                <span class="checkmark"></span>
                                            </label>
                                        </li>
                                        <li>
                                            <label class="container_check">Sport <small>24</small>
                                                <input type="checkbox" name="choix[]" <?php echo ((!isset($_POST['choix']))?'':'checked="checked"'); ?>  value="Sport">
                                                <span class="checkmark"></span>
                                            </label>
                                        </li>
                                        <li>
                                            <label class="container_check">Bon vivants <small>23</small>
                                                <input type="checkbox" name="choix[]"  <?php echo ((!isset($_POST['choix']))?'':'checked="checked"'); ?> value="Bon vivants">
                                                <span class="checkmark"></span>
                                            </label>
                                        </li>


    et le traitement pour les chexboxes:

    <?php
    
    								 	// Traitement Checkboxes Choix
    								    if(isset($_POST['choix']))
    								    {
    								      
    								      $nombre=$_POST['choix'];
    								      $total=count($nombre);
    								      
    									 // Boucle sur le choix des checkboxes
    								      for( $i=0; $i<$total; $i++ )
    								      {
    								        echo $nombre[$i].' - ';
    								      }
    								    }  
    								?>


    Docn actuellement le traitement permet de vérifier ce qui est sélectionné mais les checkboxes coché ne correspondes pas.

    Merci à vous

    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2021 à 10:44:37

      Salut

      Dans le code HTML, à la place de vérifier si $_POST['choix'] existe, il vaudrait mieux vérifier s'il n'est pas vide (ce qui implique qu'il existe) et aussi que la valeur de la checkbox est dans le tableau $_POST['choix']. Du coup tu pourras cocher les cases correctes selon les choix effectués.

      • Partager sur Facebook
      • Partager sur Twitter
        23 septembre 2021 à 11:33:21

        Merci à toi,

        alors je ne sais pas si c'est mieux mais bon je débute

        au début totu doit etre coché quand on arrive sur la page

        du coup j'ai pensé à ça: v( si le formulaire n'ai pas soumis du coup on check tout)

         // Si aucun choix de fait au coche tout par default
        					           if(empty($_POST['submit'])){
        						           	$check = 'checked="checked"';
        						           }else{
        						           	$check = NULL;
        						        }


        Du coup mes checkboxes ressemble à ça:

        <li>
        								        <label class="container_check">Art & Culture <small>12</small>
        								            <input type="checkbox" name="choix[]" <?php echo $check; ?> value="Art & Culture">
        								            <span class="checkmark"></span>
        								        </label>
        								    </li>
        								    <li>
        								        <label class="container_check">Sport <small>24</small>
        								            <input type="checkbox" name="choix[]" <?php echo $check; ?> value="Sport">
        								            <span class="checkmark"></span>
        								        </label>
        								    </li>


        Bon le problème forcèmeent que meme si je déselectionne une checkboxe une fois soumis ça resete séletionner et forcèment ne correspont à mon tableau $_POST['choix']

        • Partager sur Facebook
        • Partager sur Twitter
          23 septembre 2021 à 11:35:41

          Oui, il faut avoir le test dans chacune des cases à cocher. Et le test va donc consister en "est-ce que le formulaire n'a pas été soumis ou que le choix de cette checkbox a été coché ?".

          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2021 à 12:07:29

            Donc voilà j'ai décidé de testé avec in-yarray mais je n'arrive pas à mettre plusieurs valeurs...désolé

            <?php
            											if(isset($_POST['choix'])){
            												    if(in_array('danser', $_POST['choix'])){
            												        $check = 'checked="checked"';
            												    }else{
            												    	$check = NULL;
            												    }
            												}
            
            											var_dump($_POST['choix']);
            
            										?>
            je pensé juste rajouté

             if(in_array('danser', 'sport',$_POST['choix'])){

            mais ça ne marche pas

            et pour les checkboxe je fait comme ceci:

            <li>
            								        <label class="container_check">Danser <small>12</small>
            								             <input type="checkbox" name="choix[]" <?php echo $check; ?> value="danser">
            								            <span class="checkmark"></span>
            								        </label>
            								    </li>





            • Partager sur Facebook
            • Partager sur Twitter
              23 septembre 2021 à 12:27:51

              Ymox a écrit:

              il faut avoir le test dans chacune des cases à cocher

              Tu ne peux évidemment pas tester globablement pour chacune des valeurs des cases à cocher, il te faudra forcément des tests séparés pour chacune des valeurs.

              • Partager sur Facebook
              • Partager sur Twitter
                27 septembre 2021 à 10:35:52

                Salut

                Bon il y a surement mieux mais j'ai trouvé par moi meme et c'est deja ca

                voila:

                <?php
                	// Form
                	if(!empty($_POST)){
                
                	if(!empty($_POST['danser'])) {
                	   $check = 'checked="checked"';
                	}else{
                	   $check = NULL;
                	 }
                }
                et exemple d'une checkboxe:
                <li>
                								        <label class="container_check">Danser <small>12</small>
                								             <input type="checkbox" name="danser" <?php echo $check;?> value="danser">
                								            <span class="checkmark"></span>
                								        </label>
                								    </li>
                					?>



                -
                Edité par MikeSpense 27 septembre 2021 à 10:37:03

                • Partager sur Facebook
                • Partager sur Twitter
                  27 septembre 2021 à 12:10:49

                  Mmm, non. Ne change pas le name de tes checkboxes, c'est le test que tu dois adapter.

                  Ta version avec in_array() me semblait correcte, simplement il faut l'avoir autant de fois que tu as des cases à cocher, avec à chaque fois la valeur de recherche correspondant à la valeur de la checkbox que tu affiches après.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 octobre 2021 à 15:59:40

                    Si je comprends ce que tu dit du coup je vérifie si le tableau comporte la valeur si oui je fait mon traitement sql

                    donc :

                    // traitement categorie sport
                                if(in_array('categorie_sport', $_POST['check_list'])){
                                         $check = 'checked="checked"';
                                          $sql .= ' AND categorie_sport = 1';
                                       }else{
                                            $check = NULL;
                                 }

                    et coté input j'ai donc :

                    <label class="container_check">
                    											 <li><input type="checkbox" name="check_list[]" value="categorie_sport"><label>Sport</label><span class="checkmark"></span></li>
                    								    	</label>

                    Le code à l'air de marché pour affiché les données selon l'inout si je fait la vérification de l'array pour chaque input

                    cependant par default tout doit s'affiché et tout soit etre coché après seulement si la personne désélectionne une checkboxe alors on change la valeur

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 octobre 2021 à 16:14:52

                      Tu peux montrer l'entier de ton code en une fois, s'il te plaît ? J'ai l'impression que tu te compliques un peu la vie.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 octobre 2021 à 11:57:19

                        Bonjour

                        Les checkboxes ( en tout une dizaine j'en met que 3 dans le code pour illustré seulement ) et supprimé ma pseudo partie PHP surement mal pensé

                        donc :

                        <form method="post">
                        	<ul>
                        									<label class="container_check">Sport
                        									 <li><input type="checkbox"  name="check_list[]" value="categorie_sport"><span class="checkmark"></span></li>
                        								    </label>
                        
                        								    <label class="container_check">Art & Culture
                        									 <li><input type="checkbox" name="check_list[]" value="categorie_art><span class="checkmark"></span></li>
                        								    </label>
                        
                        								     <label class="container_check">Nocturne
                        									 <li><input type="checkbox" name="check_list[]" value="categorie_nocturne><span class="checkmark"></span></li>
                        								    </label>
                        
                        
                        								</ul>
                        <button type="submit" class="btn_1 outline full-width">Filter</button>
                        					</form>



                        J'ai du coup avant ca ma requete qui s'éxécute parfaitement sans problèmes maintenant je souhaite du coup pouvoir faire mon système de gestion via les chexboxes du coup elle doivent:

                        - être toute cochées par default

                        - pouvoir les cochés et décochées comme on souhaite

                        - la page sera rechargé après soumission du formulaire

                        Du coup je met en post ma requete ( complexe à mon sens pour la gestion du filtre kilométrique mais ça marche ) donc juste à trouvé comment gérer les fameuse checkboxes :

                         // Vérifications
                            // ****
                            // Si aucune ville de renseignée
                            if(empty($_GET['ville'])) {
                            	header('Location: index.php');
                            }else{
                            	$ville = htmlspecialchars(ucfirst(strtolower($_GET['ville'])));
                            }
                        
                             // Pagination
                                    $page = (!empty($_GET['page']) ? (int)$_GET['page'] : 1);
                                    $limite = 24; // Nombre d'élément à afficha dans la page
                                    $debut = ($page - 1) * $limite;
                        
                        
                            		// Requete principale
                          			$sql = 'SELECT * FROM sorties WHERE sortie_active = "1" AND (ville = :ville'; 
                            		$pos_ville = $bdd->prepare("SELECT lattitude, longitude, Nom_commune, slug_commune FROM villes_de_france WHERE slug_commune = :ville");
                                    $pos_ville->execute(['ville' => $ville]);
                                    $row = $pos_ville->fetch(PDO::FETCH_ASSOC);  
                                    
                                                
                                    $latitude=$row['lattitude'];
                                    $longitude=$row['longitude'];
                        
                        
                                    // Filtre de Distance Renseigné
                                    if (!empty($_POST['distance'])) {
                                       $_SESSION['rayon'] = $_POST['distance'];
                                       $rayon = $_SESSION['rayon'];
                                    }
                        
                                    // Si on renseigne une valeur kilométrique
                                    if (!empty($rayon) && ($rayon != '0')) { 
                                    $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                    $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                    $proxi_ville = $bdd->prepare($proxi_ville);
                                    $proxi_ville->execute();
                                    $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                    }elseif (empty($_POST['distance'])){ 
                                    $rayon = '20';
                                    $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                    $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                    $proxi_ville = $bdd->prepare($proxi_ville);
                                    $proxi_ville->execute();
                                    $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                    }
                        
                        
                        
                                     // Traitement SQL du formulaire
                                    if (isset($_POST)){
                                        $sql .= ')';
                                    
                               
                                    // Checkboxes traitement
                                
                        
                                }
                                
                            //$sql .= " GROUP BY nom_etablissement " ;
                            //$sql .= " GROUP BY sortie_date" ;
                            $sql .= " ORDER BY sortie_date ASC, ( ville = :ville ) DESC, ville ASC " ;
                            $sql .= ' LIMIT :limite OFFSET :debut'; // Limitation à l'affichage des données
                            $sql = $bdd->prepare($sql);
                            $sql->bindParam(':ville', $ville, PDO::PARAM_STR);
                            $sql->bindValue('debut', $debut, PDO::PARAM_INT);
                            $sql->bindValue('limite', $limite, PDO::PARAM_INT);
                            $sql->execute();
                        
                            $resultFoundRows = $bdd->query('SELECT found_rows()');
                            $nombredElementsTotal = $resultFoundRows->fetchColumn();
                            $nombreDePages = ceil($nombredElementsTotal / $limite);
                        
                            // DEBUG
                            var_dump($sql);
                            var_dump($_POST);
                           
                        
                        ?>



                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 octobre 2021 à 14:23:40

                          C'est dommage, parce que du code purement HTML pour tes cases à cocher ne me permet pas de voir comment tu avais articulé avec les conditions pour savoir si elles devaient ou non être cochées, ce qui est sauf erreur de ma part le but du sujet…

                          Mais en gros j'imagine quelque chose comme ce qui suit.

                          <input
                                  type="checkbox"
                                  type="checkbox"
                                  name="check_list[]"
                                  value="categorie_nocturne" <?php
                              if (!empty($_POST['check_list'])
                                      && in_array('categorie_nocturne', $_POST['check_list']):
                                  ?>checked="checked" <?php
                              endif; ?>/>

                          A noter que ceci peut tout à fait être inséré dans une boucle qui itère sur les différents choix possibles.

                          Tu me feras le plaisir de supprimer l'appel à htmlspecialchars() ligne 7 du second code ci-dessus, il n'a strictement rien à faire là.

                          -
                          Edité par Ymox 13 octobre 2021 à 14:24:26

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 octobre 2021 à 11:12:25


                            J'ai corrigé les 2 petits truc qui manqué la parenthèse et le > de ton code

                            J'ai donc du coup:

                            <ul>
                            <li> <label class="container_check">Sport <input type="checkbox" name="check_list[]"value="categorie_sport" <?php if (!empty($_POST['check_list']) && in_array('categorie_sport', $_POST['check_list'])):?>checked="checked" <?php endif; ?>/><span class="checkmark"></span></li> </label></li>
                            </ul>

                            J'ai ma requete ou je dois gérer maintenant en plus la soumission du form code actuelle j'ai donc:

                             <?php
                             	// setlocale(LC_TIME, "fr_FR", "French");
                                session_start();
                                include('include/conndb.php');
                                include('include/variables.php');
                            
                                // Vérifications
                                // ****
                                // Si aucune ville de renseignée
                                if(empty($_GET['ville'])) {
                                	header('Location: index.php');
                                }else{
                                	$ville = ucfirst(strtolower($_GET['ville']));
                                }
                            
                                 // Pagination
                                        $page = (!empty($_GET['page']) ? (int)$_GET['page'] : 1);
                                        $limite = 24; // Nombre d'élément à afficha dans la page
                                        $debut = ($page - 1) * $limite;
                            
                            
                                		// Requete principale
                              			$sql = 'SELECT * FROM sorties WHERE sortie_active = "1" AND (ville = :ville'; 
                                		$pos_ville = $bdd->prepare("SELECT lattitude, longitude, Nom_commune, slug_commune FROM villes_de_france WHERE slug_commune = :ville");
                                        $pos_ville->execute(['ville' => $ville]);
                                        $row = $pos_ville->fetch(PDO::FETCH_ASSOC);  
                                        
                                                    
                                        $latitude=$row['lattitude'];
                                        $longitude=$row['longitude'];
                            
                            
                                        // Filtre de Distance Renseigné
                                        if (!empty($_POST['distance'])) {
                                           $_SESSION['rayon'] = $_POST['distance'];
                                           $rayon = $_SESSION['rayon'];
                                        }
                            
                                        // Si on renseigne une valeur kilométrique
                                        if (!empty($rayon) && ($rayon != '0')) { 
                                        $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                        $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                        $proxi_ville = $bdd->prepare($proxi_ville);
                                        $proxi_ville->execute();
                                        $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                        }elseif (empty($_POST['distance'])){ 
                                        $rayon = '20';
                                        $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                        $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                        $proxi_ville = $bdd->prepare($proxi_ville);
                                        $proxi_ville->execute();
                                        $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                        }
                            
                            
                            
                                         // Traitement SQL du formulaire
                                        if (isset($_POST)){
                                            $sql .= ')';
                                        
                            
                                        // Checkboxes traitement
                                      	/*   $sql .= !!! le bout de code permettant de gérer les chexboxes */
                                      	
                                    
                            
                                    }
                                    
                                //$sql .= " GROUP BY nom_etablissement " ;
                                //$sql .= " GROUP BY sortie_date" ;
                                $sql .= " ORDER BY sortie_date ASC, ( ville = :ville ) DESC, ville ASC " ;
                                $sql .= ' LIMIT :limite OFFSET :debut'; // Limitation à l'affichage des données
                                $sql = $bdd->prepare($sql);
                                $sql->bindParam(':ville', $ville, PDO::PARAM_STR);
                                $sql->bindValue('debut', $debut, PDO::PARAM_INT);
                                $sql->bindValue('limite', $limite, PDO::PARAM_INT);
                                $sql->execute();
                            
                                $resultFoundRows = $bdd->query('SELECT found_rows()');
                                $nombredElementsTotal = $resultFoundRows->fetchColumn();
                                $nombreDePages = ceil($nombredElementsTotal / $limite);
                            
                                // DEBUG
                                var_dump($sql);
                                var_dump($_POST);
                               
                            
                            ?>

                            les cases à cocher doivent etre toute cochées à l'arrivé sur la page et l'utilisateur peut ensuite décoché pour filtrer ou recochez si il le souhaite

                            Du coup est ce que je doits faire un système de gestion pour les chexboxes comme ci dessous pour chaque case :

                            // traitement categorie sport
                                        if(in_array('categorie_sport', $_POST['check_list'])){
                                                 $check = 'checked="checked"';
                                                  $sql .= ' AND categorie_sport = 1';
                                               }else{
                                                    $check = NULL;
                                         }

                            Merci encore



                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 octobre 2021 à 11:19:44

                              A mon avis, oui. Après, à toi de gérer si tu veux avoir cette gestion avec le reste du code PHP ou si ça te va de le laisser là où la case à cocher s'affiche. Personnellement, je préfère avoir cette logique avec l'affichage, dans la mesure où je vois ça justement comme de la logique d'affichage : la case à cocher, en soi, on l'affiche de toute façon, le fait qu'elle soit cochée ou non relève aussi d'un aspect visuel et non purement fonctionnel.

                              Par rapport à ce que j'avais fourni, il devrait suffire de changer un ou deux détails. Tu veux que la case soit cochée si $_POST['check_list'] est vide ou si la valeur de la case à cocher a été transmise. Donc, toujours par rapport à ce que j'avais fourni, il faudrait juste enlever le ! et remplacer && par ||.

                              -
                              Edité par Ymox 14 octobre 2021 à 11:20:49

                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 octobre 2021 à 11:34:00

                                J'ai remplacer le bout de code :

                                	<ul>
                                									<label class="container_check">Sport
                                									<input type="checkbox" name="check_list[]"value="categorie_sport" <?php
                                    if (empty($_POST['check_list']) || in_array('categorie_sport', $_POST['check_list'])):?>checked="checked" <?php
                                    endif; ?>/><span class="checkmark"></span></li>
                                								    </label>
                                
                                								</ul>

                                J'ai donc effectivement ma case à cocher qui est "coché" par default .

                                Dans ma logique à l'arrivé sur la page la requête principal affiche toutes les sorties, ensuite on peut filtrer les résultats afin d'affichés que certaines sorties

                                le hic actuellement c'est que si je décoche  "sport" par exemple ça me renvoie tout quand même alors que normalement ce qui est "sport' devrait disparaitre

                                je remet le code pour un meilleur visuel:

                                <?php
                                 	// setlocale(LC_TIME, "fr_FR", "French");
                                    session_start();
                                    include('include/conndb.php');
                                    include('include/variables.php');
                                
                                    // Vérifications
                                    // ****
                                    // Si aucune ville de renseignée
                                    if(empty($_GET['ville'])) {
                                    	header('Location: index.php');
                                    }else{
                                    	$ville = ucfirst(strtolower($_GET['ville']));
                                    }
                                
                                     // Pagination
                                            $page = (!empty($_GET['page']) ? (int)$_GET['page'] : 1);
                                            $limite = 24; // Nombre d'élément à afficha dans la page
                                            $debut = ($page - 1) * $limite;
                                
                                
                                    		// Requete principale
                                  			$sql = 'SELECT * FROM sorties WHERE sortie_active = "1" AND (ville = :ville'; 
                                    		$pos_ville = $bdd->prepare("SELECT lattitude, longitude, Nom_commune, slug_commune FROM villes_de_france WHERE slug_commune = :ville");
                                            $pos_ville->execute(['ville' => $ville]);
                                            $row = $pos_ville->fetch(PDO::FETCH_ASSOC);  
                                            
                                                        
                                            $latitude=$row['lattitude'];
                                            $longitude=$row['longitude'];
                                
                                
                                            // Filtre de Distance Renseigné
                                            if (!empty($_POST['distance'])) {
                                               $_SESSION['rayon'] = $_POST['distance'];
                                               $rayon = $_SESSION['rayon'];
                                            }
                                
                                            // Si on renseigne une valeur kilométrique
                                            if (!empty($rayon) && ($rayon != '0')) { 
                                            $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                            $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                            $proxi_ville = $bdd->prepare($proxi_ville);
                                            $proxi_ville->execute();
                                            $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                            }elseif (empty($_POST['distance'])){ 
                                            $rayon = '20';
                                            $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                            $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                            $proxi_ville = $bdd->prepare($proxi_ville);
                                            $proxi_ville->execute();
                                            $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                            }
                                
                                
                                
                                             // Traitement SQL du formulaire
                                            if (isset($_POST)){
                                                $sql .= ')';
                                            
                                            // traitement categorie sport
                                            if(in_array('categorie_sport', $_POST['check_list'])){
                                                     $check = 'checked="checked"';
                                                      $sql .= ' AND categorie_sport = 1';
                                                   }else{
                                                        $check = NULL;
                                             }
                                
                                            // Checkboxes traitement
                                          	/*   $sql .= !!! le bout de code permettant de gérer les chexboxes */
                                          	
                                        
                                
                                        }
                                        
                                    //$sql .= " GROUP BY nom_etablissement " ;
                                    //$sql .= " GROUP BY sortie_date" ;
                                    $sql .= " ORDER BY sortie_date ASC, ( ville = :ville ) DESC, ville ASC " ;
                                    $sql .= ' LIMIT :limite OFFSET :debut'; // Limitation à l'affichage des données
                                    $sql = $bdd->prepare($sql);
                                    $sql->bindParam(':ville', $ville, PDO::PARAM_STR);
                                    $sql->bindValue('debut', $debut, PDO::PARAM_INT);
                                    $sql->bindValue('limite', $limite, PDO::PARAM_INT);
                                    $sql->execute();
                                
                                    $resultFoundRows = $bdd->query('SELECT found_rows()');
                                    $nombredElementsTotal = $resultFoundRows->fetchColumn();
                                    $nombreDePages = ceil($nombredElementsTotal / $limite);
                                
                                    // DEBUG
                                    var_dump($sql);
                                    var_dump($_POST);
                                   
                                
                                ?>





                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 octobre 2021 à 11:37:30

                                  La catégorie de sport est actuellement en dur dans ta requête, je pense qu'il faudrait prendre en compte ce qu'il y a dans $_POST'check_list'] aussi à ce moment-là. Regarde du côté de l'opérateur SQL IN.

                                  A mon avis, les lignes 63 et 65 à 67 ne servent à rien.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 octobre 2021 à 11:50:35

                                    EDIT

                                    j'ai fait ce que tu ma dit mais erreur:

                                    peut etre que je ne stock pas la valeur correctement mais bon je ne pense pas que ça soit cela

                                    en bdd la table "sorties" à une colonne du coup "categorie_sport" de type INT qui peut avoir comme valeur du coup 1 ou 0

                                    après avec ce que tu m'a dit j'ai donc : ( en supprilant la partie inutile )

                                    // Traitement SQL du formulaire
                                                if (isset($_POST['check_list'])){
                                                    $sql .= ')';
                                                
                                                // traitement categorie sport
                                                if(in_array('categorie_sport', $_POST['check_list'])){
                                                         $sql .= ' IN  (categorie_sport = 1)';
                                                       }
                                    
                                            	}


                                    un var dump la requete SQL me donne donc :

                                    SELECT * FROM sorties WHERE sortie_active = "1" AND (ville = :ville OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE (6366*acos(cos(radians(45.1821215167))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians(5.72133051752))+sin(radians(45.1821215167))*sin(radians(`lattitude`))))<='20' )  ORDER BY sortie_date ASC, ( ville = :ville ) DESC, ville ASC  LIMIT :limite OFFSET :debut


                                    J'ai rien qui s'affiche en resultat du coup à l'arrivé sur la page par contre sir je valide le formulaire j'ai les sorties


                                    EDIT

                                    -
                                    Edité par MikeSpense 14 octobre 2021 à 11:57:28

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 octobre 2021 à 12:13:47

                                      Il faudrait que la requête prenne en compte les choix effectués, là tu ne prends en compte qu'un seul d'entre eux, et tu n'as pas vraiment regardé comment l'opérateur IN pouvait/devait être utilisé.

                                      Du moment qu'au moins une catégorie de sport était sélectionnée, alors il faut que la requête contienne la contrainte sur ladite catégorie.

                                      Ce qui me fait remarquer que, pour une raison ou une autre, tu as mis des chaînes de caractères comme valeurs des cases à cocher plutôt que les IDs qui seraient bien plus pratiques pour la requête.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 octobre 2021 à 15:19:53

                                        Du coup j'essai différentes chose afin d'essayé de trouvé comment avancé un peu

                                        coté requete pour le IN je pense etre pas loin du compte mais voilà :

                                         //requete IN ...
                                        		 if(isset($_POST)){
                                                   	$check_selection = '';
                                                   	if(!empty($_POST["check_list"])) {
                                                    foreach($_POST["check_list"] as $choix){
                                                     $check_selection .= $choix . ', ';
                                                    }
                                                    $check_selection = substr($check_selection, 0, -2);
                                                    $sql .= "IN ('$check_selection')";
                                                   }
                                                  }



                                        l'idée semble bien mais du coup cela demande à repdnre les checkboxes je supose car le système de noit pas etre adapté ainsi que la structure de la bdd non ?

                                        EDIT

                                        Je m'embrouille je pense surtout,

                                        faut il gréer une 2éme table en bdd avec les catégories (type_activite)

                                        - danser

                                        - nocturne

                                        - ...

                                        et associer un id de sortie

                                        ...

                                        -
                                        Edité par MikeSpense 14 octobre 2021 à 15:27:08

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 octobre 2021 à 16:01:21

                                          Je te déconseille très fortement la concaténation telle que tu le fais, niveau sécurité c'est vraiment pas le top, et en plus la syntaxe n'est pas bonne (tu auras du point de vue SQL une unique chaîne de caractères avec toutes les valeurs séparées par des virgules, alors qu'il lui faut autant de chaînes que de valeurs).

                                          Tu pourrais te simplifier la vie avec implode() plutôt qu'une boucle et une troncature. Mais surtout, il faut sécuriser les valeurs du tableau avec $bdd->quote dans ton cas précis avant de faire quoi que ce soit pour mettre les valeurs dans la requête.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 octobre 2021 à 16:12:31

                                            Quelques chose comme ça:

                                             <?php
                                             	// setlocale(LC_TIME, "fr_FR", "French");
                                                session_start();
                                                include('include/conndb.php');
                                                include('include/variables.php');
                                            
                                                // Vérifications
                                                // ****
                                                // Si aucune ville de renseignée
                                                if(empty($_GET['ville'])) {
                                                	header('Location: index.php');
                                                }else{
                                                	$ville = ucfirst(strtolower($_GET['ville']));
                                                }
                                            
                                                 // Pagination
                                                        $page = (!empty($_GET['page']) ? (int)$_GET['page'] : 1);
                                                        $limite = 24; // Nombre d'élément à afficha dans la page
                                                        $debut = ($page - 1) * $limite;
                                            
                                            
                                                		// Requete principale
                                              			$sql = 'SELECT * FROM sorties WHERE sortie_active = "1" AND (ville = :ville'; 
                                                		$pos_ville = $bdd->prepare("SELECT lattitude, longitude, Nom_commune, slug_commune FROM villes_de_france WHERE slug_commune = :ville");
                                                        $pos_ville->execute(['ville' => $ville]);
                                                        $row = $pos_ville->fetch(PDO::FETCH_ASSOC);  
                                                        
                                                                    
                                                        $latitude=$row['lattitude'];
                                                        $longitude=$row['longitude'];
                                            
                                            
                                                        // Filtre de Distance Renseigné
                                                        if (!empty($_POST['distance'])) {
                                                           $_SESSION['rayon'] = $_POST['distance'];
                                                           $rayon = $_SESSION['rayon'];
                                                        }
                                            
                                                        // Si on renseigne une valeur kilométrique
                                                        if (!empty($rayon) && ($rayon != '0')) { 
                                                        $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                                        $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                                        $proxi_ville = $bdd->prepare($proxi_ville);
                                                        $proxi_ville->execute();
                                                        $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                                        }elseif (empty($_POST['distance'])){ 
                                                        $rayon = '20';
                                                        $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lattitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lattitude`))))"; 
                                                        $proxi_ville="SELECT DISTINCT Nom_commune,$formule AS dist FROM villes_de_france WHERE $formule<='$rayon' ORDER by dist ASC";
                                                        $proxi_ville = $bdd->prepare($proxi_ville);
                                                        $proxi_ville->execute();
                                                        $sql .= " OR ville IN ( SELECT DISTINCT Nom_commune FROM villes_de_france WHERE $formule<='$rayon' ) " ;
                                                        }
                                            
                                            
                                            
                                                         // Traitement SQL du formulaire
                                                        if (isset($_POST)){
                                                            $sql .= ')';
                                            
                                            
                                            
                                                     //requete IN ...
                                                    if(isset($_POST)){
                                            			$check_selection = implode("','",$_POST['check_list']); 
                                            			$sql .= "IN ('$check_selection')";        
                                            		 }
                                                    
                                            
                                                    }
                                                    
                                                //$sql .= " GROUP BY nom_etablissement " ;
                                                //$sql .= " GROUP BY sortie_date" ;
                                                $sql .= " ORDER BY sortie_date ASC, ( ville = :ville ) DESC, ville ASC " ;
                                                $sql .= ' LIMIT :limite OFFSET :debut'; // Limitation à l'affichage des données
                                                $sql = $bdd->prepare($sql);
                                                $sql->bindParam(':ville', $ville, PDO::PARAM_STR);
                                                $sql->bindValue('debut', $debut, PDO::PARAM_INT);
                                                $sql->bindValue('limite', $limite, PDO::PARAM_INT);
                                                $sql->execute();
                                            
                                                $resultFoundRows = $bdd->query('SELECT found_rows()');
                                                $nombredElementsTotal = $resultFoundRows->fetchColumn();
                                                $nombreDePages = ceil($nombredElementsTotal / $limite);
                                            
                                                // DEBUG
                                                var_dump($sql);
                                                var_dump($check_selection);
                                            
                                            
                                            ?>



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 octobre 2021 à 16:18:38

                                              Oui, mais ce n'est prendre en compte qu'une partie de ma précédente réponse pour le moment.

                                              Et il me semble qu'il manque le champ sur lequel l'opérateur IN doit s'appliquer.

                                              -
                                              Edité par Ymox 14 octobre 2021 à 16:19:13

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                15 octobre 2021 à 10:56:10

                                                Bonjour

                                                Désole mais je dois m'embrouillé en bdd

                                                j'ai plusieurs colonne comme j'ai dit "categorie_sport" , "categorie_danse" , "categorie_nocturne" ... qui vaut 1 ou 0 du coup

                                                du coup je comprends bien que je dois ajouter un champ pour le IN comme le code ci dessous mais ca ne peut fonctionné :

                                                 //requete IN ...
                                                        if(isset($_POST)){
                                                			$check_selection = implode("','",$_POST['check_list']); 
                                                			$sql .= "IN categorie_sport ('$check_selection')";        
                                                		 }
                                                        

                                                et les checkboxes :

                                                	<ul>
                                                									<label class="container_check">Sport
                                                									<input type="checkbox" name="check_list[] "value="1" <?php
                                                    if (empty($_POST['check_list']) || in_array('categorie_sport', $_POST['check_list'])):?>checked="checked" <?php
                                                    endif; ?>/><span class="checkmark"></span></li>
                                                								    </label>
                                                
                                                								    <label class="container_check">nocturne
                                                									<input type="checkbox" name="check_list[]" value="1" <?php
                                                    if (empty($_POST['check_list']) || in_array('categorie_nocturne', $_POST['check_list'])):?>checked="checked" <?php
                                                    endif; ?>/><span class="checkmark"></span></li>
                                                								    </label>
                                                
                                                								</ul>
                                                								  




                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Checkboxes et traitement php

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown