salut,
première chose : tu as une erreur de syntaxe dans le case aujourd'hui (tu as mis . = au lieu de .=

)
dans ton commentaire tu indique : si aucun choix on affiche tout. Tu ne peux pas obtenir ce comportement avec ton switch. C'est forcément un des choix et "aujourd'hui" si la valeur correspondant a rien (ou a nul dans ton cas).
tout les cas de switch ne commence pas par un espace du coup le AND se collé a ce qu'il y a avant et donc tu aura une erreur SQL.
il faut éviter d'utiliser l'opérateur comme tu le fais, parce que :
- c'est moche
- c'est difficile à lire
- y a un risque de merder
Utilise des if c'est dexu lignes deux plus mais beaucoup plus simple à lire et a comprendre et impossible de se tromper quand tu écris (sauf si tu te vautre sur la condition mais c'est le cas dans les deux).
Le ternaire est a réserver pour des cas simple avec des vrai alternative de cas par défaut mais je ne pense pas que l'on ne puisse pas s'en passer.
d'ailleurs dans ton et pour suivre la logigue de l'emploi de sucre syntaxique tu peux faire plus court
'expression (expr1) ? (expr2) : (expr3) est évaluée à expr2 si expr1 est évaluée à TRUE, et expr3 si expr1 est évaluée à FALSE.
Depuis PHP 5.3, il est possible d'omettre la partie centrale de l'opérateur ternaire. L'expression expr1 ?: expr3 retourne expr1 si expr1 vaut TRUE, et expr3 sinon.
donc
$sql .= !empty($_REQUEST['region']) ? ' AND `regions`.`url` = "'.$_REQUEST['region'].'"' : NULL;
devient
$sql .= !empty($_REQUEST['region']) ?: ' AND `regions`.`url` = "'.$_REQUEST['region'].'"';
même si
if(!empty($_REQUEST['region'])){
$sql .= ' AND `regions`.`url` = "'.$_REQUEST['region'].'"';
}
est plus clair / simple à lire.
c'est d'ailleurs ce que tu fait pour le dernier cas
pour le cas week-end tu as oublié une ' avant la seconde date du coup la requête sql déconne.
Dans ce genre de casil est important d'afficher la requête pour la tester dans un client SQL c'est beaucoup plus simple et du temps de gagné à coup sur (vérification de syntaxe et que le résultat soit conforme a tes attente).
les ` sont inutiles elle ne servent que si tu as la bonne idées d'utiliser des noms de champs / table qui sont des mots réservés de mysql
ton code ré écrit plus clairement pour être ainsi
<?php
$sql = 'SELECT * FROM loisirs JOIN regions ON regions.region_id = loisirs.id_region WHERE loisirs.date_fin_sortie > NOW() AND loisirs.valide = 1';
if (!empty($_REQUEST['region'])) {
$sql .= ' AND regions.url = \''.$_REQUEST['region'].'\'';
}
if (!empty($_REQUEST['departement'])) {
$sql .= ' AND loisirs.id_departements = '.$_REQUEST['departement'];
}
if (!empty($_REQUEST['loisir'])) {
$sql .= ' AND loisirs.genre_loisir = \''.$_REQUEST['loisir'].'\'';
}
if (!empty($_REQUEST['ville'])) {
$sql .= ' AND loisirs.city = \''. getRealValue($_REQUEST['ville']). '\'';
}
// Filtre par date
switch ($typeDate) {
case 'demain':
$sql .= ' AND date_debut_sortie = \''.date('Y-m-d h:i:s', strtotime('tomorrow')).'\'';
break;
case 'we':
$sql .= ' AND date_debut_sortie BETWEEN \''. date('Y-m-d h:i:s', strtotime('next Saturday')).'\' AND \''.date('Y-m-d h:i:s', strtotime('next Monday')).'\''; //démarre à minuit
break;
case 'aujourdhui':
default:
$sql .= ' AND date_debut_sortie = \''. date('Y-m-d h:i:s', strtotime('today')).'\'';
break;
}
$req = $bdd->query($sql);
@+