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

PHP & Base de données Discussion :

Comment avoir un WHERE avec plusieurs condition [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut Comment avoir un WHERE avec plusieurs condition
    Bonjour à tous,

    Je suis un peu frustrl car j'avais déjà fait ca, mais je n'arrive pas à retoruver ce vieux code grrrr.

    J'ai ce code
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    $sql_select = 'SELECT * FROM fields AS fi 
    	LEFT JOIN stations AS st ON fi.id_field = st.fields_id_field
    	LEFT JOIN sensors AS se ON st.id_station = se.stations_id_station
    	LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
    	LEFT JOIN measures AS m ON se.id_sensor = m.sensors_id_sensor
    	LEFT JOIN collections AS c ON m.collections_id_collection = c.id_collection
    	WHERE st.id_station = '.$station.' AND c.collection_date >= "'.$from.'" AND c.collection_date <= "'.$to.'"
     
    	ORDER BY c.id_collection, c.collection_date ASC ';
     
    	$sql_result = $connect->query($sql_select);

    et je vais devoir ajouter ceci, au debut du fichier
    Code PHP : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    	if(isset($_POST['wl'])){
    		$wl = $_POST['wl'];
    	}else{
    		$wl = ""; 
    	}
     
    	if(isset($_POST['wln'])){
    		$wln = $_POST['wln'];
    	}else{
    		$wln = ""; 
     
    	}
     
    	if(isset($_POST['hws'])){
    		$hws = $_POST['hws'];
    	}else{
    		$hfs = "";
    	}
     
    	if(isset($_POST['hwb'])){
    		$hwb = $_POST['hwb'];
    	}else{
    		$hfb = ""; 
    	}
     
    	if(isset($_POST['ta'])){
    		$ta = $_POST['ta'];
    	}else{
    		$ta = ""; 
    	}
     
    	if(isset($_POST['ts'])){
    		$ts = $_POST['ts'];
    	}else{
    		$ts = ""; 
    	}
     
    	if(isset($_POST['t30'])){
    		$t30 = $_POST['t30'];
    	}else{
    		$t30 = ""; 
    	}
     
    	if(isset($_POST['t60'])){
    		$t60 = $_POST['t60'];
    	}else{
    		$t60 = ""; 
    	}
     
    	if(isset($_POST['t100'])){
    		$t100 = $_POST['t100'];
    	}else{
    		$t100 = ""; 
    	}
     
    	if(isset($_POST['t200'])){
    		$t200 = $_POST['t200'];
    	}else{
    		$t200 = ""; 
    	}
     
    	if(isset($_POST['t500'])){
    		$t500 = $_POST['t500'];
    	}else{
    		$t500 = ""; 
    	}
     
    	if(isset($_POST['t1200'])){
    		$t1200 = $_POST['t1200'];
    	}else{
    		$t1200 = ""; 
    	}

    Donc ensuite, je vais devoir ajouter un nouveau critere de recherche et je vais devoir ajouté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND stype.sensor_type_name = $wl
    mais pour chaqu'un (je ne l'ai liste pas tous.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WHERE st.id_station = '.$station.' AND c.collection_date >= "'.$from.'" AND c.collection_date <= "'.$to.'"
    AND (stype.sensor_type_name = $wl
    OR stype.sensor_type_name = $wln
    OR stype.sensor_type_name = $hfs
    OR stype.sensor_type_name = $hfb)

    Il y a pas une solution plus simple?
    Bien entendu, si $_POST['wl'] n'existe pas, $wl prend la valeur NULL car il ne doit pas extraire une valeru correspondant $ wl.

    Pourriez-vous me mettre sur la piste pour extraire les donnnées correspondant au $POST existant et qui ont une valeur?

    Milles mercis pour vos lumières!!

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 673
    Par défaut
    tout d'abord, il vaut mieux éviter de mettre directement des valeurs non vérifiées dans un requête.
    cela peut ouvrir la porte à des attaques par SQL injection
    https://securite.developpez.com/faq/...-SQL-Injection

    qu'utilisez vous pour vous connecter à la base de données ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND (stype.sensor_type_name = $wl
    OR stype.sensor_type_name = $wln
    OR stype.sensor_type_name = $hfs
    OR stype.sensor_type_name = $hfb)
    s'écrit :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ( stype.sensor_type_name IN ( $wl, $wln, $hfs, $hfb ) )

    Par contre, il est plus malin d'utiliser les id !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Hello!!!

    merci pour vos propositions

    @Matthieu.
    Merci pour cette observation.
    J'ai lu que magic_quote était depraciate. Il faudrait donc que j'ajoute des stripslashes

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql_select = 'SELECT * FROM fields AS fi 
    	LEFT JOIN stations AS st ON fi.id_field = st.fields_id_field
    	LEFT JOIN sensors AS se ON st.id_station = se.stations_id_station
    	LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
    	LEFT JOIN measures AS m ON se.id_sensor = m.sensors_id_sensor
    	LEFT JOIN collections AS c ON m.collections_id_collection = c.id_collection
    	WHERE st.id_station = '.stripslashes($station).' AND c.collection_date >= "'.stripslashes($from).'" AND c.collection_date <= "'.stripslashes($to).'"
     
    	ORDER BY c.id_collection, c.collection_date ASC ';

    Mais je vais resté concentré sur ma requete des filtres pour le moment, je me concentrai la dessus, après

    @jreaux62
    Ca m'intéresse bien cette solution. Il faut savoir que j'ai des checkboxs et quand je sélection un ou plusieurs check box.
    Donc mon formulaire envoie ceci (ajax+POST)
    from=&to=&station=1&ts=1&ta=1&t30=1&t60=1&t100=1
    Donc les valeur que je récupère, ne sont pas de ID, mais des 1 ou des 0 (&t30=0). En fait, c'est des 1 (&t30=1), ou ...des riens, car si la checkbox t30 n'est pas checkée, il n'y pas le paramètre &t30, dans l'URL.

    Donc si je reste sur l'expéte &t30, je le récupère ainsi:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // So existe et est egal à 1
    if(isset($_POST['t30']) && $_POST['t30']==1){
    		$t30 = "t30";
    	}else{
    		$t30 = "0"; 
    	}
    J'ai aussi une table qui liste mes capteurs et une table liée, qui liste le type de capteur.
    Dans la table 'sensor_type', j'ai un camps 'sensor_type_name' qui liste tous mes types de capteur:

    wl,
    wln,
    ta,
    ts,
    t30,
    t60,
    t120,
    ...etc
    Donc si je repreds ta proposition, et sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $wl ="wl";
    $wln = "wln";
    $hfs ="hfs";
    $hfb = "hfb";
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql_select = 'SELECT * FROM fields AS fi 
    	LEFT JOIN stations AS st ON fi.id_field = st.fields_id_field
    	LEFT JOIN sensors AS se ON st.id_station = se.stations_id_station
    	LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
    	LEFT JOIN measures AS m ON se.id_sensor = m.sensors_id_sensor
    	LEFT JOIN collections AS c ON m.collections_id_collection = c.id_collection
    	WHERE st.id_station = '.stripslashes($station).' 
            AND ( stype.sensor_type_name IN ( $wl, $wln, $hfs, $hfb ) ) 
            AND c.collection_date >= "'.stripslashes($from).'" AND c.collection_date <= "'.stripslashes($to).'"
     
    	ORDER BY c.id_collection, c.collection_date ASC ';
    On est d'accord qu'il va extraire les données liées
    • A la sattion 1 (pour autant que $station a la valeru de 1
    • Compris entre deux dates
    • les mesures dont sensor_type_name a les valeurs wl, wln, hfs, hfb

  5. #5
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Ceci serait plus cohérent (et sans doute performant)
    Chaque filtre de chaque table doit être posé à la bonne jointure.
    Je te laisse tester.

    Par ailleurs, il faut que tu fasses remonter des champs de tes 6 tables ! sinon, tu ne pourras rien vérifier !
    Là, si j'ai bien compris, tu verras la même chose que si tu demandais :

    SELECT * FROM fields

    ahahah

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql_select = 'SELECT fi.machin,fi.truc,st.bidule,se.zigouigoui,stype.trucmuche,m.tata,se.toto,c.foo
    FROM fields fi 
    LEFT JOIN stations st ON fi.id_field = st.fields_id_field and st.id_station = '.stripslashes($station).' 
    LEFT JOIN sensors se ON st.id_station = se.stations_id_station
    LEFT JOIN sensor_types stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type AND stype.sensor_type_name IN ( "'.$wl.'", "'.$wln.'", "'.$hfs.'", "'.$hfb.'" ) 
    LEFT JOIN measures m ON se.id_sensor = m.sensors_id_sensor
    LEFT JOIN collections c ON m.collections_id_collection = c.id_collection AND c.collection_date >= "'.stripslashes($from).'" AND c.collection_date <= "'.stripslashes($to).'"';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Invité
    Invité(e)
    Par défaut
    ...les valeur que je récupère, ne sont pas de ID, mais des 1 ou des 0 (&t30=0)...
    Mauvaise méthode.

    Montre-nous :
    • le bout de formulaire avec les checkbox
    • la table sensor_type (comment tu l'as remplie)


    On peut faire plus simple que ton usine à gaz.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Comme cela à été dit ca serait plus judicieux d'utiliser des id que des labels pour tes filtres.
    C'est tout à fait faisable puisqu'on peut faire renvoyer ce que l'on veux à une checkbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="truc" value="123456" />
    Retournera 123456 si cochée.

    Ensuite , ce genre de chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(isset($_POST['wl'])){
        $wl = $_POST['wl'];
    }else{
        $wl = ""; 
    }
     
    if(isset($_POST['wln'])){
        $wln = $_POST['wln'];
    }else{
        $wln = "";
    }
    peut être très largement simplifié par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $w1 = isset($_POST['wl']) ? $_POST['wl'] : "";
    $wln = isset($_POST['wln']) ?  $_POST['wln'] : "";
    Voir même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $w1 =  $_POST['wl']) ?? "";
    $wln = $_POST['wln'] ?? "";
    Si tu es en PHP 7 et +

    Note enfin, que utiliser des paramètres directement dans une requête est une faille de sécurité importante.
    Il faut soit traiter chaque paramètre individuellement , soit préparée les requêtes (solution plus simple qui évite tous les truc chiants du genre stripslashes).
    Voir http://php.net/manual/fr/pdo.prepared-statements.php et http://php.net/manual/fr/mysqli.quic...statements.php pour plus de détails
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bon. Comme grunk a (en partie) vendu la mêche , voici une bonne méthode de récupération :

    1- Pour les checkbox : on requête sur la table sensor_type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    // requete sur la table sensor_type
    // .....
    	foreach(....... as $row)
    	{
    ?>
      <input type="checkbox" name="sensor_type_ids[]" value="<?php echo $row['sensor_type_id']; ?>" /> <?php echo $row['sensor_type_name']; ?><br />
    <?php
    	}
    A noter :
    • name="sensor_type_ids[]" (avec des crochets)
    • value contient sensor_type_id (c'est là qu'est l'ASTUCE !)



    2- On récupère un array des cases cochées, contenant les sensor_type_id choisis !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sensor_type_ids_array  = $_POST['sensor_type_ids']; // c'est un array
    3- on peut construire le bout de code qui va aller dans la requête : ".... IN (.......) " :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sensor_type_ids_list = ( !empty($sensor_type_ids_array) )? implode( ',', $sensor_type_ids_array ); // on obtient : 1,14,15,...
    $clauseAND = "";
    if( !empty($sensor_type_ids_list) )
    {
       $clauseAND .= " AND stype.sensor_type_id IN (" . $sensor_type_ids_list . ") ";

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

Discussions similaires

  1. [MySQL] Creer une clause WHERE avec deux conditions donne erreur
    Par Salsaboy60 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/04/2014, 10h39
  2. Réponses: 0
    Dernier message: 02/03/2011, 23h26
  3. Comment avoir un composant texte avec plusieurs styles?
    Par byubi dans le forum Composants
    Réponses: 1
    Dernier message: 02/05/2009, 12h12
  4. Réponses: 3
    Dernier message: 11/04/2008, 09h31
  5. Réponses: 10
    Dernier message: 26/03/2008, 15h00

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