IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Requete WHERE selon checkbox + GET


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut Requete WHERE selon checkbox + GET
    Bonjour,

    J'ai besoin sur mon site web de créer un filtre de recherche. Pour des questions de simplicité, je vais opter pour une méthode GET, et passer les infos par l'uRL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    		<input type="checkbox" name="frequence" value="Quotidien">Quotidien<br>
    		<input type="checkbox" name="frequence" value="Hebdomadaire">Hebdomadaire<br>
    		<input type="checkbox" name="frequence" value="Bi-Mensuel">Bi-Mensuel<br>
    		<input type="checkbox" name="frequence" value="Mensuel">Mensuel<br>
    		<input type="checkbox" name="frequence" value="Vacances">Vacances<br>
     
    		<input type="checkbox" name="jour" value="Lundi">Lundi<br>
    		<input type="checkbox" name="jour" value="Mardi">Mardi<br>
    		<input type="checkbox" name="jour" value="Mercredi">Mercredi<br>
    		<input type="checkbox" name="jour" value="Jeudi">Jeudi<br>
    		<input type="checkbox" name="jour" value="Vendredi">Vendredi<br>
    		<input type="checkbox" name="jour" value="Samedi">Samedi<br>
    		<input type="checkbox" name="jour" value="Dimanche">Dimanche<br>
    		<input type="checkbox" name="jour" value="multi">Plusieurs Jours<br>
    Dans ma page de traitement, Je récupère les infos de l'url
    exemple d'URL : Trait_filtre.php?frequence=Quotidien&frequence=Hebdomadaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (isset($_GET['frequence']) || isset($_GET['jour']) || isset($_GET['plage']) || isset($_GET['public']) || isset($_GET['lieu']) || isset($_GET['cours']) || isset($_GET['tarif'])){
    J'ai donc un problème pour établir une requete générique qui fonctionne ave toutes les conditions sélectionnés par l'utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Activite WHERE frequence='".$_GET['frequence']."' ....
    Car si plusieurs conditions dans une même catégorie, il ne me prends en compte que la dernière (voir mon ex d'URL).
    Si je mets dans ma requete WHERE une condition que l'utilisateur n'a pas sélectionné. Elle va être vide. ex : WHERE frequence=

    J'espère que vous m'avez compris...
    Merci pour votre aide.
    Mikael

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Un petit morceau de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php
    	$liste = array(
    				'frequence'=>array(
    						'quotidien' => 'Quotidien',
    						'hebdomadaire'=>'Hebdomadaire',
    						'bi-Mensuel'=>'Bi-Mensuel'
    						)
    					 ,
    				'jour'=>array(
    						'lundi' => 'Lundi',
    						'mardi'=>'Mardi'
    				)
    		);
     
    	//traitement 
    	$where = "";
    	if(isset($_GET['valider']) && $_GET['valider']=='Envoyer' ){
    		foreach($liste as $key =>$values ){
    			if(isset($_GET[$key])){
    					foreach($values as $k  =>$v  ){
    							if(in_array($k,$_GET[$key]) ){
    							echo $v;
    							$where.= "$key=$v  ||";
    						}
    					}				
    			}
    		}
    		if($where != ''){
    			$where = substr ( $where , 0 , - 2 ) ;
    			$where = 'SELECT * FROM Activite WHERE ('.$where.')';
    			echo $where;
    		}
    	}
     
    	//Formulaire
    	?>
     
    <html5>
    	<body>
    		<form method=GET action='#'>
    		<?php
    		foreach($liste as $key =>$values ){
    					foreach($values as $k  =>$v  ){
    						?><input type="checkbox" name="<?php echo $key?>[]" value="<?php echo $k ?>"><?php echo $v ?><br><?php
    					}		
    		}     
    		?>
    		<input type='submit' name='valider' value='Envoyer' />
    		</form>
    	</body>
    </html>

  3. #3
    Membre émérite Avatar de patrickbaras
    Homme Profil pro
    Informaticien (à sa mémère).
    Inscrit en
    Septembre 2010
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien (à sa mémère).
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Par défaut
    ajoute [] dans le nom des champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <input type="checkbox" name="frequence[]" value="Quotidien">Quotidien<br>
    <input type="checkbox" name="frequence[]" value="Hebdomadaire">Hebdomadaire<br>
    <input type="checkbox" name="frequence[]" value="Bi-Mensuel">Bi-Mensuel<br>
    <input type="checkbox" name="frequence[]" value="Mensuel">Mensuel<br>
    <input type="checkbox" name="frequence[]" value="Vacances">Vacances<br>
    
    <input type="checkbox" name="jour[]" value="Lundi">Lundi<br>
    <input type="checkbox" name="jour[]" value="Mardi">Mardi<br>
    <input type="checkbox" name="jour[]" value="Mercredi">Mercredi<br>
    <input type="checkbox" name="jour[]" value="Jeudi">Jeudi<br>
    <input type="checkbox" name="jour[]" value="Vendredi">Vendredi<br>
    <input type="checkbox" name="jour[]" value="Samedi">Samedi<br>
    <input type="checkbox" name="jour[]" value="Dimanche">Dimanche<br>
    <input type="checkbox" name="jour[]" value="multi">Plusieurs Jours<br>
    et le code pour récupérer les info et construire le SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $sql = "SELECT * FROM Activite WHERE 1=0";
     
    if(isset($_GET["frequence"]))
    {
    	foreach ($_GET["frequence"] as $key => $val)
    	{
    		$sql .= " OR frequence = '".$val."'";
    	}
    }
    if(isset($_GET["jour"]))
    {
    	foreach ($_GET["jour"] as $key => $val)
    	{
    		$sql .= " OR jour = '".$val."'";
    	}
    }
    echo $sql;

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    Merci pour vos réponses rapides...

    patrickbaras, je teste ta réponse. J'avais vu sur un site que le fait de rajouter des crochets [], permettait de faire des regroupements.

    Par contre, peux-tu m'expliquer le WHERE 1=0 ? Je ne comprends pas.
    Pour le reste, si il y a une variable, il fait une boucle et pour chacune il ajoute à la requete sql OR ....

    J'ai ajouté le code à ma page de traitement, mais il doit y avoir une erreur car j'ai une page blanche, et je ne vois pas ou !!!

    Merci

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Tu devrais utiliser mon code; il fonctionne sans rien toucher, séparation des traitements et de l'affichage, création du formulaire et test avec le tableau de départ, évolutif.... c'est comme ca qu'il faut voir ton script ( au moins la logique ), si tu veux pas te prendre la tête des que tu va ajouter une categorie , etc....

    enfin , fait comme tu veux, après tout

    ma fois wat esle...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    Pour la page blanche, c'est résolu... Une accolade en trop...

    ascito, je vais essayer ton code aussi, mais c'est vrai que celui là est trés facile à mettre en oeuvre.

  7. #7
    Membre émérite Avatar de patrickbaras
    Homme Profil pro
    Informaticien (à sa mémère).
    Inscrit en
    Septembre 2010
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien (à sa mémère).
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Par défaut
    Citation Envoyé par mikael2235 Voir le message
    peux-tu m'expliquer le WHERE 1=0 ?
    c'est une astuce quand je dois ajouter une serie de OR nomdechamp=' '
    je met WHERE 1=0 (une condition toujour fausse puisque 1 ne seras jamais = à zéro)
    de cette manière je peux ajouter autant de fois "OR condition"
    sans devoir me soucier de supprimer le premier "OR"
    puisque normalement je devrais écrire WHERE condition1 OR condition2 OR ...
    mais comme cela ca fait "WHERE 1=0 OR condition1 OR condition2 OR ..."
    idem pour une serie de condition AND cette fois on met 1=1 car c'est toujours vrais
    et ca donne
    "WHERE 1=1 AND condition1 AND condition2 AND ..."
    pas besoin de supprimer le premier AND

  8. #8
    Membre émérite Avatar de patrickbaras
    Homme Profil pro
    Informaticien (à sa mémère).
    Inscrit en
    Septembre 2010
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien (à sa mémère).
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Par défaut
    si comme on te le conseille judicieusement tu veux ajouter un controle des valeurs authorisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    $frequences = array('Quotidien', 'Hebdomadaire', 'Bi-Mensuel', 'Mensuel', 'Vacances');
    $jours      = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche', 'multi');
    $sql = "SELECT * FROM Activite WHERE 1=0";
    
    if(isset($_GET["frequence"]))
    {
    	foreach ($_GET["frequence"] as $key => $val)
    	{
    		if(in_array ( $val , $frequences ))
    		{
    			$sql .= " OR frequence = '".$val."'";
    		}
    	}
    }
    if(isset($_GET["jour"]))
    {
    	foreach ($_GET["jour"] as $key => $val)
    	{
    		if(in_array ( $val , $jours ))
    		{
    			$sql .= " OR jour = '".$val."'";
    		}
    	}
    }
    echo $sql;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete : filtre selon format des données
    Par bogros dans le forum Access
    Réponses: 2
    Dernier message: 23/05/2006, 11h28
  2. Envoi selon checkbox sélectionnées
    Par Polaire76 dans le forum Langage
    Réponses: 1
    Dernier message: 29/03/2006, 11h32
  3. [9i 9.2.0.1] Pb requete where
    Par stephDeZ dans le forum Oracle
    Réponses: 10
    Dernier message: 07/02/2006, 00h00
  4. [Requete][Where] Quelle est l'utilité d'une clause: 1=1 ?
    Par alpachico dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/12/2005, 18h40
  5. [Requete action]selon les critères de 2 champs, en modifié 1
    Par Nicko29 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/11/2005, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo