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

  1. #1
    Membre régulier
    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
    Points : 104
    Points
    104
    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 éprouvé

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    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>
    Conception / Dev

  3. #3
    Membre éprouvé 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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Points : 1 103
    Points
    1 103
    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;
    ce message vous a aidé ! Un petit click sur fait toujours plaisir

    "Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent." Bev Littlewood & Lorenzo Strigini

    "Le logiciel, c’est comme le sexe, c’est meilleur quand c’est libre/gratuit." Linus Torvalds

  4. #4
    Membre régulier
    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
    Points : 104
    Points
    104
    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 éprouvé

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    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...
    Conception / Dev

  6. #6
    Membre régulier
    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
    Points : 104
    Points
    104
    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
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    le code d'ascito vérifie au moins les valeurs entrées quand il fait in_array().
    Voici une autre approche en suivant le conseil de patrickbaras au sujet des accolades :
    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
    <?php
     
    // valeurs autorisées
    $frequences = array('Quotidien', 'Hebdomadaire', 'Bi-Mensuel', 'Mensuel', 'Vacances');
    $jours      = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche', 'multi');
     
    $where       = array();
    $freq_values = array();
    $jour_values = array();
     
     
    // quote une valeur pour la base de données 
    $as_string = function($p) { return "'$p'"; };
     
    if ( ! empty($_GET['frequence'])) {
        // on croise les tableaux pour ne pas injecter des valeurs non-autorisées et on quote les valeurs
        $freq_values = array_map($as_string, array_intersect($frequences, $_GET['frequence']));
        $where[]     = 'frequence IN ('.implode(', ', $freq_values).')';
     
    }
     
    if ( ! empty($_GET['jour'])) {
        // on croise les tableaux pour ne pas injecter des valeurs non-autorisées et on quote les valeurs 
        $jour_values = array_map($as_string, array_intersect($jours, $_GET['jour']));
        $where[]     = 'jour IN ('.implode(', ', $jour_values).')';
    }
     
    $sql = 'SELECT * FROM Activite ';
     
    if ( ! empty($where)) {
        $sql .= 'WHERE'. implode(' OR ', $where);   
    }
     
    ?>

  8. #8
    Membre éprouvé 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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Points : 1 103
    Points
    1 103
    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
    ce message vous a aidé ! Un petit click sur fait toujours plaisir

    "Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent." Bev Littlewood & Lorenzo Strigini

    "Le logiciel, c’est comme le sexe, c’est meilleur quand c’est libre/gratuit." Linus Torvalds

  9. #9
    Membre éprouvé 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 : 60
    Localisation : Belgique

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Points : 1 103
    Points
    1 103
    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;
    ce message vous a aidé ! Un petit click sur fait toujours plaisir

    "Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent." Bev Littlewood & Lorenzo Strigini

    "Le logiciel, c’est comme le sexe, c’est meilleur quand c’est libre/gratuit." Linus Torvalds

  10. #10
    Membre éprouvé

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    si comme on te le conseille judicieusement tu veux ajouter un controle des valeurs authorisées :
    c'est pas un conseil judicieux, c'est une méthode de travail à appliquer A LA LETTRE, (dans la conception ) c'est tout...

    car voit tu patrick, il y a un topic qui parle de sécurité, un autre, de performance, un autre de comment faire un formulaire, si tu commence à ne pas respecter les fondamentaux des Un et des Autres, qui sont simples , comment veux tu avoir un support souple, et agréable pour que l'on puisse répondre trankil aux questions un peu plus élaborées ?

    1 ) php traitement des données , montage des variables
    2 ) montage de la page html

    je vois pas pourquoi, intel ou intel, ne prendra pas le temps de savoir ce qu'est un foreach, ou ce qu'est un tableau . Php , il y énormément de personnes qui veulent vraiment s'impliquer , et aussi connaitre un peu les ficelles, si tu ne donnes pas les outils de départs, personne ne sera là dans 20 ans pour prendre la relève.

    alors c'est peu être moi, qui en fait encore tout un packet pour rien, mais quand même..
    Conception / Dev

  11. #11
    Membre régulier
    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
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    Je reprends le sujet, et vos dernières réponses.
    Je vais ajouter les in_array, qui me permettront de controler que les valeurs sont OK.

    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
     
    $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;
    De plus, J'ai modifié ma base depuis et je rentre les valeurs avec un implode.
    (par exemple pour "$jours=Lundi,Mardi, Mercredi")

    Comment puis-je faire pour que les OR de ma requete verifie si mon champs contient l'une des valeurs, mais pas obligatoirement toutes ?

    Merci

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,
    Citation Envoyé par mikael2235 Voir le message
    De plus, J'ai modifié ma base depuis et je rentre les valeurs avec un implode.
    (par exemple pour "$jours=Lundi,Mardi, Mercredi")

    Comment puis-je faire pour que les OR de ma requete verifie si mon champs contient l'une des valeurs, mais pas obligatoirement toutes ?

    Merci
    Comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE jour LIKE '%Mardi%'

  13. #13
    Membre régulier
    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
    Points : 104
    Points
    104
    Par défaut
    Encore merci rawsrc !
    Rapide et efficace.

+ 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