voilà j'ai plus ou moins avancé sur mon projet mais j'ai un petit problème
En fait j'essai de filtrer mes "sorties" selon des checkboxes ( à l'arrivé de la page on affiche tout) puis ensuite via les checkboxes on filtre
actuellement cela marche si on choisi "nocturne" cella affiche les sortie ou la valeur nocturne vaut 1 en bdd et pareil pour "sport"
par contre si je veux afficher les 2 type de sortie donc "nocturne" et "sport" alors cela ne marche pas,
Mon code en est la raison puisque la requete demande a affiché si les deux type de sorties valent 1 , mais moi je cherche affiché que l'une ou valent 1 et je ne sais comment faire
<?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 INNER JOIN categorie_de_sortie ON sorties.sortie_id = categorie_de_sortie.sortie_id 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)){
$check = NULL;
$sql .= ')';
// AND Multiples Checkboxes
if (isset($_POST['cat_sport'])) {
$sql .= ' AND cat_sport = 1';
}
// AND Multiples Checkboxes
if (isset($_POST['cat_nocturne'])) {
$sql .= ' AND cat_nocturne = 1';
}
if (!empty($_POST['categorie_sport'])) {
$check = 'checked="checked"';
}else{
NULL;
}
}
//$sql .= " GROUP BY sortie_id" ;
$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);
?>
Le code pourrait être bien plus simple, je pense, si toutes les checkbox avaient le même nom et que tu jouais sur leur valeur (genre cat_sport passe du name au value) plutôt que d'avoir un nom différent pour chacune d'elles. Ca te permettrait d'itérer directement sur une unique variable plutôt que d'avoir à tester chacune d'elles. On peut tout de même en l'état faire un tableau des clés POST (avec un mapping sur la colonne ?) pour déjà réduire le code. Il y en a réellement combien de ces clés cat_* ?
Par ailleurs, il y a peut être là une première erreur de modélisation : ces colonnes cat_* auraient pu/dû être une relation many to many (ie avoir une table catégories ? en plus et une pour faire la relation entre cette dernière et les villes ?)
× 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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli