Selectpicker gérer le select all PHP

Fermé
Money - 26 janv. 2023 à 15:29
 Money - 27 janv. 2023 à 16:50

Bonjour,

J'essaye de faire des champs pour faire un filtre et j'ai un petit problème qui se règle vite j'en suis sûr !

J'ai un champ de sélection (liste déroulante) à choix multiples :

<label for="etat">État</label>
            <select class="selectpicker" name="etat[]" multiple data-live-search="true" data-actions-box="true" id="etat" data-style="btn-white border" title="">
                <option value="encours">En cours</option>
                <option value="clos">Clos</option>
            </select>

Avec donc 2 options soit en cours soit clos ce qui est traduit part 1 ou 0 dans ma bdd.

J'arrive à gérer lorsque l'utilisateur choisis une option ou l'autre mais quand il sélectionne les deux ça prend en compte seulement la première (encours).

Mon code :

if($_POST['etat'][0] == "encours") {
            $clos = " clos = 0 AND ";
        }
        else if($_POST['etat'][0] == "clos") {
            $clos = " clos = 1 AND ";
        }
        else if($_POST['etat'][0] == ["encours"] && $_POST['etat'][1] == ["clos"]) {
            $clos = " ";
        }

J'ai essayé pleins de trucs mais ça ne fonctionne pas, une idée ?

A voir également:

2 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
26 janv. 2023 à 22:00

Bonjour,

Tu prends ton IF / ELSEIF / ELSE à l'envers.....

Forcément, si les deux sont cochés .. ta première condition est donc vraie .... et ton code ne va pas plus loin...

Il te faut donc tester en premier la présence des deux... puis  chaque vérification individuelle.

Bien entendu, pour éviter d'éventuelles erreurs de code ( dans le cas ou un seul ou aucun élément ne serait cliqué ), il faut, avant de les utiliser, récupérer PROPREMENT les variables.

Je t'invite à appliquer ce qui est indiqué ici :

https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index


0

Ok tout s'affiche bien mais j'ai quand même des erreurs comme tu dis "récupérer proprement les variables.

J'ai une erreur quand je chois en cours : 

Notice: Undefined offset: 1 in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1383

Et une autre quand je ne sélectionne rien : 

Notice: Undefined index: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364

Pcq j'utilise ma fonction pour filtrer dans une fonction de mon controller : 

$donneesEtat = $this->incident->mapFilter($_POST['etat']);

Sinon ce que je récupère est bon, code : 

$etat = isset($_POST['etat']) ? $_POST['etat'] : NULL;
        
        if(!empty($_POST['etat'])) {
            if($_POST['etat'][0] == "encours" && $_POST['etat'][1] == "clos") {
                $clos = " ";
            }
            else if($_POST['etat'][0] == "encours") {
                $clos = "clos = 0 AND ";
            }
            else if($_POST['etat'][0] == "clos") {
                $clos = "clos = 1 AND ";
            }
        }
        else {
            echo "c'est vide";
            $etat = null;
            $clos = "";
        }        

,

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717 > Money
27 janv. 2023 à 15:22

Si tu récupères proprement les variables avant de les utiliser ......  tu ne dois donc plus utiliser les $_POST  dans le reste du code....

0

J'ai essayé comme ça : 

 $etat = isset($_POST['etat']) ? $_POST['etat'] : NULL;
        
        if(!empty($etat)) {
            if($etat == "encours" && $etat == "clos") {
                $clos = " ";
            }
            else if($etat == "encours") {
                $clos = "clos = 0 AND ";
            }
            else if($etat == "clos") {
                $clos = "clos = 1 AND ";
            }
        }
        else {
            echo "c'est vide";
            $etat = null;
            $clos = "";
        }   
 $donneesEtat = $this->incident->mapFilter($etat);

Une erreur à chaque résultat : 

Que ça soit en cours, clos ou tout sélectionné :

Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController..php on line 364

Notice: Undefined variable: clos in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1407

Si rien n'est sélectionné : 

Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
Modifié le 27 janv. 2023 à 16:29
 
$etat est une variable de type ARRAY qui contient 1 ou 2 valeurs 
 
$etat[0]  et/ou $etat[1]

ça reviendrait donc à écrire un truc du genre :

$etat = !empty($_POST['etat']) ? $_POST['etat'] : NULL;

if($etat){
$etat_encours =  !empty($etat[0]) ? true : false;
$etat_clos =  !empty($etat[1]) ? true : false;

if($encours && $clos) {
	$clos = "";
} else if($etat_clos) {
	$clos = " clos = 1 AND ";
} else if($encours) {
	$clos = " clos = 0 AND ";
} 


 // le reste de ton code


}
0
Money > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
27 janv. 2023 à 16:14

J'ai repris ton code et remis $etat en paramètre de l'appel de ma fonction 

Pour en cours, clos et rien : 


Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364

Notice: Undefined variable: encours in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1385

Notice: Undefined variable: encours in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1389

Notice: Undefined variable: clos in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1400

Quand c'est en cours et clos : 


Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364

Notice: Undefined variable: encours in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1385

Y a un truc qui cloche, en plus aucun des résultats n'est bon que ce soit en cour ou clos il me renvoi les 2 et quand je sélectionne les 2 il me renvoi seulement les clos, ça n'a aucun sens

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717 > Money
27 janv. 2023 à 16:29

faudrait :

1- nous montrer ton code COMPLET

2 - ajouter un var_dump de la variable $_POST au début du script pour voir ce qu'elle contient

0
Money > jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024
27 janv. 2023 à 16:50

Ma fonction de filtre : 

public function mapFilter($etat) {

        $etat = !empty($_POST['etat']) ? $_POST['etat'] : NULL;
        $etat_encours =  !empty($etat[0]) ? true : false;
        $etat_clos =  !empty($etat[1]) ? true : false;

        if($etat_encours && $etat_clos) {
            $clos = "";
        } else if($etat_clos) {
            $clos = " clos = 1 AND ";
        } else if($etat_encours) {
            $clos = " clos = 0 AND ";
        } 

        $req = $this->getBdd()->prepare(
        "SELECT nom, lat, long, date, type, ref, clos
        FROM incidentville as iv
        LEFT JOIN ville as v
        ON iv.ville_id = v.id
        LEFT JOIN incident as i
        ON iv.incident_id = i.id
        WHERE ". $clos."lat IS NOT NULL"
        );
        $req->execute();
        $allVilleEtat = $req->fetchAll(PDO::FETCH_ASSOC);
        $req->closeCursor();
        return $allVilleEtat;        


    }

Mon appel à ma fonction

public function map()
    {       

        $this->incident = new Incident;
        $donneesEtat = $this->incident->mapFilter($etat);

        require "views/incident/map.view.php";
    }

Var_dump : 

var_dump($_POST) quand j'arrive sur ma page me donne un tableau vide -> array(0) { } 

Quand je sélectionne en cours -> array(2) { ["etat"]=> array(1) { [0]=> string(7) "encours" } ["filtremap"]=> string(0) "" } 
filtremap et mon bouton pcq c'est au clique du bouton que ca s'affiche et c'est dans mon var dump de post pcq j'ai ça : 

if(isset($_POST['filtremap'])) {
    var_dump($_POST);
}

Un var dump de $_POST['etat] qaund je sélectionne en cours et clos par exemple : 
array(2) { [0]=> string(7) "encours" [1]=> string(4) "clos" } 

Quand je sélectionne clos :
array(1) { [0]=> string(4) "clos" } 

Quand je sélectionne en cours :
array(1) { [0]=> string(4) "en cours" }

Ce que ça me retourne : 

Ca c'est le var_dump de ma variable $donneesEtat : 

array(27) { [0]=> array(7) { ["nom"]=> string(14) "nom d'une ville" ["latitude"]=> string(7) "49.3167"... 
et c'est la que je vois si il me sort que des incidents clos, encours ou les deux avec :
[...]"clos"]=> string(1) "0"

Pour l'instant avec ce code, mes erreurs sont : 

Quand je sélectionne encours, clos ou rien : 


Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364

Notice: Undefined variable: clos in C:\Applications\wamp64\www\portail\models\Incident.class.php on line 1400

Quand je sélectionne les 2 : 


Notice: Undefined variable: etat in C:\Applications\wamp64\www\portail\controllers\IncidentController.php on line 364

Les infos dans les var_dump des $_POST sont cohérentes, je vois pas ou est le problème 

0