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 :

requête SQL avec variables non renseignées [MySQL]


Sujet :

PHP & Base de données

Vue hybride

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

    Informations forums :
    Inscription : Février 2010
    Messages : 137
    Par défaut requête SQL avec variables non renseignées
    Bonjour,
    J'ai une requête mySQL qui porte sur une bdd de 8 tables, le tout dans un script PHP.

    La requête en question :
    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
    Select nomspot, image
    from tspot, tacces, tcommune, tdifficulte, tlocalite, tpays, tregion, ttype 
    				where tspot.nocommune=tcommune.nocommune 
    				and ttype.notype=tspot.notype 
    				and tlocalite.nolocal=tspot.nolocal 
    				and tspot.nodiff=tdifficulte.nodiff 
    				and tacces.noacces=tspot.noacces 
    				and tregion.noregion=tcommune.noregion
    				and tpays.nopays=tregion.noregion
    				and tspot.nocommune='".$_POST["nocommune"]."'
    				and tspot.notype='".$_POST["notype"]."'
    				and tspot.nolocal='".$_POST["nolocal"]."'
    				and tspot.nodiff='".$_POST["nodiff"]."'
    				and tspot.noacces='".$_POST["noacces"]."'
    				and tpays.nopays='".$_POST["nopays"]."'
    				and tregion.noregion='".$_POST["noregion"]."';
    La requête retourne bien le résultat voulu quand TOUTES les variables renseignées concordent. Si il y a incompatibilité, mon script me retourne bien un message d'erreur. En revanche, ce que j'aimerais, c'est que la requête me retourne des résultats même si toutes les variables ne sont pas renseignées.

    Je m'explique : si je renseigne par exemple nocommune=1
    notype=1
    nolocal=2
    nodiff=1
    noacces=1
    nopays=1
    noregion=1,

    il existe un "nomspot" qui regroupe toutes ces caractéristiques, et la requête me le retourne.
    En revanche si je ne renseigne que : nopays=1, je voudrais avoir tous les "nomspot" correspondant à ce pays, sans tenir compte de "notype", "nolocal" ou encore "noacces".
    Est-ce possible, ou faut-il que je crée différentes requête en fonction des champs remplis?

    En espérant avoir été clair, je vous remercie d'avance de votre attention et de vos eventuelles réponses.

  2. #2
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Soit plusieurs requête ...

    Soit l'utilisation des OR mais là il faudra faire une écriture bien carrée ...
    Par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select nomspot, image
    from tspot, tacces, tcommune, tdifficulte, tlocalite, tpays, tregion, ttype 
    where (les and pour les jointures) + (les and pour les valeurs)
    Avec pour les and concernant les valeurs faire tes différents cas
    Par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (les and pour les valeur) =
          (les and d'un premier groupe) OR
          (les and d'un deuxième groupe) OR
          ....
          (les and d'une valeur simple comme NoPays) OR
          (les and d'une autre valeur simple) OR
          ....

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    La requête retourne bien le résultat voulu quand TOUTES les variables renseignées concordent
    Il faudrait créer une chaine SQL qui se contruierait selon la présence ou non des paramètres POST.

    Petite parenthèse en passant.
    Il est préférable d'utiliser des jointures "naturelles" dans le FROM (JOIN ou INNER JOIN par exemple), et non de simple équivalences entre les tables.
    On réserve le WHERE uniquement pour les clauses (ou conditions)
    Et pour simplifier les tout, mettre des "alias" aux tables.

    A titre d'exemple :
    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
     
    $select = 'SELECT nomspot, image';
     
    $from ' FROM tspot ts
    JOIN tcommune tc ON tc.nocommune = ts.nocommune
    JOIN tdifficulte td ON td.nodiff = ts.nodiff
    ... etc ...';
     
    $where = ' WHERE';
    if (isset($_POST["nocommune"]) && !empty($_POST["nocommune"])) {
    	$where .= " ts.nocommune = '".$_POST["nocommune"]."'";
    }
    ... etc pour les autre POST ...
     
    $sql = $select.$from.$where;
    En revanche si je ne renseigne que : nopays=1, je voudrais avoir tous les "nomspot" correspondant à ce pays, sans tenir compte de "notype", "nolocal" ou encore "noacces".
    Il faudrait alors tenir compte de ta condition au niveau Php.

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $where = ' WHERE';
    if (isset($_POST["nopays"]) && $_POST["nopays"] == 1) {
    	// Construire le $where avec uniquement les équivalences souhaités
    	// On exclus les notype, nolocal, noacces
    }
    else {
    	if (isset($_POST["notype"]) && !empty($_POST["notype"])) {
    		$where .= " ts.notype= '".$_POST["notype"]."'";
    	}
    	// ... etc ...
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 137
    Par défaut
    Re Bonjour, et Merci beaucoup !

    J'ai les résultats escomptés, j'ai utilisé la méthode décrite par RunCodePhp avec la construction de la requête en fonction de la présence de variable. J'y avais pensé, mais étant un grand novice en php, je ne connaissais ni "isset", ni "!empty" .

    Juste pour info la requête ressemble pour l'instant à cela, et fonctionne :
    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
    $select = 'SELECT nomspot, image';
     
        $from = ' FROM tspot ts, tpays tp, tregion tr, tcommune tc'
        ;
     
    	$where = ' where ts.nocommune=tc.nocommune
    				and tr.noregion=tc.noregion
    				and tp.nopays=tr.nopays';
    if (isset($_POST["nocommune"]) && !empty($_POST["nocommune"])) {
    	$where .= " and ts.nocommune = '".$_POST["nocommune"]."'";
    }
    if (isset($_POST["nopays"]) && !empty($_POST["nopays"])) {
    	$where .= " and tp.nopays = '".$_POST["nopays"]."'";
    }
    if (isset($_POST["noregion"]) && !empty($_POST["noregion"])) {
    	$where .= " and tr.noregion = '".$_POST["noregion"]."'";
    }
    if (isset($_POST["nodiff"]) && !empty($_POST["nodiff"])) {
    	$where .= " and ts.nodiff = '".$_POST["nodiff"]."'";
    }
    if (isset($_POST["noacces"]) && !empty($_POST["noacces"])) {
    	$where .= " and ts.noacces = '".$_POST["noacces"]."'";
    }
    if (isset($_POST["nolocal"]) && !empty($_POST["nolocal"])) {
    	$where .= " and ts.nolocal = '".$_POST["nolocal"]."'";
    }
    if (isset($_POST["notype"]) && !empty($_POST["notype"])) {
    	$where .= " and ts.notype = '".$_POST["notype"]."'";
    }
     
    	$requete = $select.$from.$where;
    Je l'ai simplifiée, n'ayant pas besoin d'autant de jointures et je changerai ces dernières en "JOIN" comme conseillé par la suite.

    Un grand merci pour cette rapidité et cette efficacité, je suis bluffé !

  5. #5
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bien joué pour le code RunCodePhp

    J'suis partis en quenouille pour le coup ...

    Mets nous un beau Résolu 'Boris' tu sais bien que je suis dans ma semaine des tags résolus

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

Discussions similaires

  1. Syntaxe pour requête SQL avec variables
    Par molibri dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2010, 14h50
  2. Requête SQL avec variable externe
    Par Kesle dans le forum Bases de données
    Réponses: 15
    Dernier message: 15/05/2009, 18h14
  3. [MySQL] Requête SQL avec variable
    Par kate59 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 14h12
  4. Requête SQL avec variables
    Par BMT_Benoît dans le forum Windows Forms
    Réponses: 36
    Dernier message: 12/07/2007, 12h35
  5. Problème avec requête SQL avec variables
    Par harry25 dans le forum ASP
    Réponses: 1
    Dernier message: 03/01/2007, 03h41

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