Fonction de filtrage sur carte PHP
Résolu/Fermé- Fonction de filtrage sur carte PHP
- Carte d'identité - Accueil - Services publics
- Fonction si et - Guide
- Pile carte mere - Guide
- Mettre des points sur une carte - Guide
- Blocage agriculteur carte en temps réel - Accueil - Transports & Cartes
7 réponses
9 févr. 2023 à 16:19
bonjour,
Si je comprends bien, tu souhaites que, pour ta seconde requête, $filtrefinal contienne du texte. Quel texte?
9 févr. 2023 à 16:28
Ta ligne 15 me semble suspecte.
A ta place, je ferais, après la ligne 54, des var_dump des variables $etat2, $departement2, $type_alerte2.
Modifié le 9 févr. 2023 à 16:35
Bonjour,
Pour commencer, je pense que tu peux remplacer
if (!empty($etat)) { for ($i = 0; $i < count($etat); $i++) { if($i >= 1 ) { $etat2 .= " OR "; $etat2 .= "clos = " . htmlentities($etat[$i]); } else { $etat2 = "clos = " . htmlentities($etat[$i]); } } } else { $etat2 = htmlentities($etat); }
par simplement une écriture ternaire et du join ..
$etat2 = !empty($etat) ? " clos IN ('" . join("','",$etat) . "') " : "";
Puis, en te basant sur cet exemple .. faire pareil avec tes deux autres conditions
/!\ htlmentities , htmlspacialchars .. sont des fonctions à utiliser UNIQUEMENT pour de l'affichage ... pas pour du "pré-traitement" des variables pour une requête sql;...
Merci de vos retours,
je vais essayer vos deux propositions et je vous fait un retour demain
Re j'i capté d'où venait le problème en fait c'était un niveau de l'appel de ma fonction tout simplement j'avais oublié un truc :
de base :
if (isset($_POST['etat'])) {
$donneesEtat = $this->Manager->mapFilter($_POST['etat'], $_POST['departement'], $_POST['type_alerte']);
} else {
$donneesEtat = $this->Manager->mapFilter(null, null, null);
}
correction :
if (isset($_POST['etat']) || isset($_POST['departement']) || isset($_POST['type_alerte'])) { $donneesEtat = $this->Manager->mapFilter($_POST['etat'], $_POST['departement'], $_POST['type_alerte']); } else { $donneesEtat = $this->Manager->mapFilter(null, null, null); }
Mais j'ai un autre problème de requête que je ne sais comprendre :
"SELECT nom, latitude, longitude, dates_heures_alarme, type_alerte, reference_derco, clos FROM problemecity as pc LEFT JOIN city as c ON pc.city_id = c.id LEFT JOIN probleme as p ON pc.pb3_id = p.id LEFT JOIN dep as d ON c.departement_id = d.id WHERE clos = 0 OR clos = 1 AND (nom_d ='orne') latitude IS NOT NULL"
Et sur ma carte ça met des points sur les départements qui ne sont pas dans l'Orne (c'est le var_dump($req) au dessus) je teste aussi sur phpMyAdmin c'est donc ma requête qui n'est pas bonne une idée de pourquoi ma requête me ressort des villes qui sont dans un autre département que celui que j'ai dans mon select ?
10 févr. 2023 à 15:48
Visiblement tu n'as pas tenu compte de ma précédente remarque et il semble qu'il manque une condition and devant le mot latitude
10 févr. 2023 à 15:48
Je suppose qu'il manque une partie de ta clause WHERE.
clos = 0 OR clos = 1 AND (nom_d ='orne') latitude IS NOT NULL
Quand tu écris
A OR B AND C
C'est équivalent à
A OR (B and C)
Alors que tu veux probablement obtenir
(A OR B) AND C
En cas de doute sur la priorité des opérateurs, n'hésite pas à mettre des parenthèses.
10 févr. 2023 à 15:51
En utilisant, comme je lui ai déjà suggéré , des IN() au lieu de multiplier les OR il limitera ce genre de soucis..
10 févr. 2023 à 16:11
J'ai pas compris ton code la ternaire ok mais le join je ne connais pas de plus IN pour mon champ clos qui est un entier ne va pas fonctionné non ? Il faut un = ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionEn effet ça à l'air pas mal avec la solution de jordane45 :
$etat2 = !empty($etat) ? " clos IN ('" . join("','",$etat) . "') " : ""; if(!empty($departement)) { if(isset($etat)) { $departement2 = ' AND '; } else { $departement2 = ''; } $departement2 .= !empty($departement) ? " nom_d IN ('" . join("','",$departement) . "') " : ""; } else { $departement2 =""; } if (!empty($type_alerte)) { if(isset($etat) || isset($departement)) { $type_alerte2 = ' AND '; } else { $type_alerte2 = ''; } $type_alerte2 .= !empty($type_alerte) ? " type_alerte IN ('" . join("','",$type_alerte) . "') " : ""; } else { $type_alerte2 = ""; } $filtrefinal = $etat2. $departement2. $type_alerte2; ...
13 févr. 2023 à 12:24
Je ne suis pas surpris, il est en général de bon conseil.
Modifié le 13 févr. 2023 à 12:26
remplace ton code par ça
$filtres = []; $filtres[] = !empty($etat) ? " clos IN ('" . join("','",$etat) . "') " : ""; $filtres[] = !empty($departement) ? " nom_d IN ('" . join("','",$departement) . "') " : ""; $filtres[] = !empty($type_alerte) ? " type_alerte IN ('" . join("','",$type_alerte) . "') " : ""; $filtrefinal = !empty($filtres) ? join (" AND " , $filtres ) : "";
13 févr. 2023 à 13:41
J'ai essayé et ça me met un AND en trop :
$filtres = [];
$filtres[] = !empty($etat) ? " clos IN ('" . join("','",$etat) . "') " : "";
$filtres[] = !empty($departement) ? " nom_d IN ('" . join("','",$departement) . "') " : "";
$filtres[] = !empty($type_alerte) ? " type_alerte IN ('" . join("','",$type_alerte) . "') " : "";
$filtrefinal = !empty($filtres) ? join (" AND " , $filtres ) : "";
$req = $this->getBdd()->prepare(
"SELECT nom, latitude, longitude, dates_heures_alarme, type_alerte, reference_derco, clos
FROM [...]
WHERE ". $filtrefinal."(latitude IS NOT NULL)"
);
var_dump($req);
$req->execute();
$allVilleEtat = $req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
return $allVilleEtat;
var_dump de $req et l'erreur pdo :
Quand je sélectionne uniquement $etat et que je sélectionne en cours et clos :
SELECT nom, latitude, longitude, dates_heures_alarme, type_alerte, reference_derco, clos FROM [...] WHERE clos IN ('0','1') AND AND (latitude IS NOT NULL)" }
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AND (latitude IS NOT NULL)' at line 9 in C:\Applications\wamp64\www\portail\models\Manager.class.php on line 1500
13 févr. 2023 à 14:43
oui, désolé,
plutôt
$filtres = []; if(!empty($etat)){ $filtres[] = " clos IN ('" . join("','",$etat) . "') " ; } if(!empty($departement)){ $filtres[] = " nom_d IN ('" . join("','",$departement) . "') " ; } if(!empty($type_alerte)){ $filtres[] = " type_alerte IN ('" . join("','",$type_alerte) . "') "; } $filtrefinal = !empty($filtres) ? join (" AND " , $filtres ) : "";
Ouais la ça marche beaucoup mieux, merci
Dernière question j'ai toujours cette erreur "undefined index" quand je ne renseigne pas un des select qui vient de mon controller où j'appel ma fonction :
if (isset($_POST['etat']) || isset($_POST['departement']) || isset($_POST['type_alerte'])) {
$donneesEtat = $this->Manager->mapFilter($_POST['etat'], $_POST['departement'], $_POST['type_alerte']);
} else {
$donneesEtat = $this->Manager->mapFilter("", "", "");
}
Au début j'avais mis (null, null, null) et la avec les guillemets vide je pensait que ça marcherait mais non
13 févr. 2023 à 15:36
//on récupère PROPREMENT les variables AVANT de les utiliser $etat = !empty($_POST['etat']) ? $_POST['etat']: ""; $departement = !empty($_POST['departement']) ? $_POST['departement']: ""; $type_alerte = !empty($_POST['type_alerte']) ? $_POST['type_alerte']: ""; $donneesEtat = $this->Manager->mapFilter($etat, $departement, $type_alerte);