Requête filtre check box

Eléphant du PHP | 297 Messages

10 nov. 2024, 15:31

Bonjour,
Je coince sur une requete depuis des mois :?

J'ai besoin de faire un filtre sur des voyages selon les villes qu'ils incluent.

J'ai une table avec une colonne pour le code voyage, et plusieurs colonne pour chaque ville, qui marque 0, si l'itineraire ne passe pas par cette ville, ou un numero propre a la ville si l'itineraire y passe.

Je souhaite afficher les itineraires passant par exemple par 3 villes choisies par check box.

C'est la que je bloque. J'ai commencé par une requete avec condition WHERE et chaque ville LIKE

Code : Tout sélectionner

WHERE santiago LIKE '%$santiago%' AND valparaiso LIKE '%$valparaiso%' AND ile_de_paques LIKE '%$idp%' AND arica LIKE '$arica' AND


le probleme est que j'ai peu de résultats, car si j'ai coché santiago et valparaiso, tous les autres variable seront à 0. Alors que je n'ai aucun circuit qui ne passe par seulement Santiago et Valparaiso. Il y a toujours d'autres villes.

Je pense qu'il faut j'injecte dans la requete, les cases chochées avec un systeme de tableau.

Qu'en pensez vous ?

Avatar du membre
Mammouth du PHP | 1525 Messages

11 nov. 2024, 13:09

Salut,

LIKE n'est pas adapté si tes colonnes sont 0/1, fais plutôt ceci qui sera adapté et plus rapide :

Code : Tout sélectionner

WHERE santiago = 1 AND valparaiso = 0...
Pour définir tes variables $santiago, $valparaiso... venant de checkbox :
$valparaiso = isset($_POST['valparaiso']) ? 1 : 0;

Eléphant du PHP | 297 Messages

12 nov. 2024, 13:51

salut two3d,
Merci pour ta réponse. J'ai optimisé comme tu m'as dit. C'est mieux dans mon afficchage. Mais j'ai toujours ce soucis:
Si j'ai un voyage qui passe par santiago, valparaiso, san pedro, et que je coche santiago et valparaiso, il ne s'affichera pas, car dans ma requete san pedro est egal à 0.
Je souhaiterai qu'il s'affiche car je veux voir les voyage qui passe au moins par santiago et valparaiso.

Avatar du membre
Mammouth du PHP | 1525 Messages

12 nov. 2024, 14:47

Utilise OR dans ce cas, car AND oblige la requête à retourner "ceci ET cela", avec OR : "ceci OU cela".

Eléphant du PHP | 297 Messages

12 nov. 2024, 18:53

Merci, mais le problème avec OR, c'est que ça va tout m'afficher. Donc je n'ai plus la fonciton filtre souhaitée.

ex: WHERE santiago=1 OR Valparaiso=1 OR san pedro =0...

Dans ce cas je demande les voyages avec qui passe au moins par santiago et valparaiso, et ça va m'afficher tous les voyages qui passent par santiago OU valapraiso OU pas par san pedro...

Avatar du membre
Mammouth du PHP | 1525 Messages

12 nov. 2024, 22:21

C'est normal, il te faut faire une requête avec uniquement les valeurs qui sont 1 et pas 0.

WHERE santiago=1 OR Valparaiso=1 (ignorer les cases non cochées comme pedro =0)

Eléphant du PHP | 297 Messages

13 nov. 2024, 00:10

Justement, je ne sais pas écrire ce type de requete avec juste les cases cochées.
Cela fait 1 an que j'ai cette fonction de coté, et que je n'arrive pas à avancer.
Faut-il faire une sélection en amont ? avec un systeme de tableau (arrays) ?

Avatar du membre
Mammouth du PHP | 1525 Messages

13 nov. 2024, 01:16

Oui, l'idée est de définir tes variables puis d'en faire une requete avec uniquement celles définies (= 1, ou "isset" si tu préfères).

Une approche :
//nos noms d'input cochables
$noms_inputs_cochables = [
	'santiago',
	'valpareso',
	'pedro',
];

//on va enregistrer les cases cochées dans ce tableau
$ORs = [];

foreach($noms_inputs_cochables as $nom){
	
	//si cette case (input) est cochée, on l'ajoute au tableau
	if(isset($_POST[$nom]))
		$ORs[] = "$nom = 1";
	
}

//ensuite, on peut l'incure dans notr requête SQL
mysqli_query($conn, "SELECT tes_colonnes,... FROM ta_table WHERE " . implode(" OR ", $ORs);
implode() aura pour effet de rassembler le tableau en une ligne en séparant les entrées par "OR".