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

Requêtes MySQL Discussion :

Distinguer ou croiser les requetes


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Par défaut Distinguer ou croiser les requetes
    Bonjour à tous,

    Je viens d'atteindre mes limites en matières de php et de requête sql...
    Voilà, je souhaite faire apparaître les résultats d'une base de données en fonction de 3 critères.
    Mais je voudrais pouvoir à la fois afficher les résultats selon 3 critères renseignés ou laisser le choix de ne donner qu'un seul critère.
    Or, pour l'instant, j'arrive à afficher le résultat si les 3 critères sont remplis, mais s'il en manque un, ça ne renvoie aucun résultat.

    Voici le code de la page de résultats :

    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
     
    if  (!empty($style) OR !empty($prix) OR !empty($lieu) ) {
     
    if ($style<>"35") {
    $testStyle=1;
    }
    if (!empty($prix)<>"") {
    $testPrix=2;
    }
    if (!empty($lieu)<>"") {
    $testLieu=4;
    }
    $test=$testStyle+$testLieu+$testPrix;
    switch ($test) {
     
    case 1:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE styleid='$style' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 2:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE prixid='$prix' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 4:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE lieuid='$lieu' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 3:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE styleid='$style' AND prixid='$prix' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 5:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE styleid='$style' AND lieuid='$lieu' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 6:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE prixid='$prix' AND lieuid='$lieu' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
    case 7:
    	$search = mysql_query("SELECT *FROM $pdpproduit WHERE styleid='$style' AND prixid='$prix' AND lieuid='$lieu' ORDER BY nom") or die ("ERROR:" . mysql_error());
            break;
     
    }
    Quelqu'un a-t-il une piste pour mon problème ?
    Merci d'avance !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 130
    Par défaut
    Bonsoir

    Ce n'est pas la bonne méthode pour ce problème classique de construction dynamique d'une chaine de requête.

    Essaie plutôt quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $query = "SELECT * FROM $pdpproduit WHERE 1=1";
     
    if ($style<>"") $query .= " AND styleid='$style'";
    if ($prix<>"") $query .= " AND prixid='$prix'";
    if ($lieu<>"") $query .= " AND lieuid='$lieu'";
    etc...
     
    puis
     
    $query .= " ORDER BY nom";
    Bon il y a plusieurs variantes de cette technique.

  3. #3
    Membre éclairé
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Par défaut
    Merci de ton aide.
    J'ai essayé ça mais j'ai une erreur.
    J'ai dû oublier un truc dans la syntaxe :

    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
    $query = "SELECT * FROM $pdpproduit WHERE 1=1";
     
    if ($style<>"") $query .= " AND styleid='$style'";
    if ($prix<>"") $query .= " AND prixid='$prix'";
    if ($lieu<>"") $query .= " AND lieuid='$lieu'";
    if ($style<>"") $query .= " AND styleid='$style' AND prixid='$prix'";
    if ($prix<>"") $query .= " AND prixid='$prix' AND lieuid='$lieu'";
    if ($lieu<>"") $query .= " AND lieuid='$lieu' AND styleid='$style'";
    if ($style<>"") $query .= " AND styleid='$style' AND prixid='$prix' AND lieuid='$lieu'";
    if ($prix<>"") $query .= " AND prixid='$prix' AND lieuid='$lieu' AND styleid='$style'";
    if ($lieu<>"") $query .= " AND lieuid='$lieu' AND styleid='$style' AND prixid='$prix'";
    { 
    $query .= " ORDER BY nom";
     
    }
    $num = mysql_num_rows($query);

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 130
    Par défaut
    Non c'est beaucoup plus simple , juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query = "SELECT * FROM $pdpproduit WHERE 1=1";
     
    IF ($style<>"") $query .= " AND styleid='$style'";
    IF ($prix<>"") $query .= " AND prixid='$prix'";
    IF ($lieu<>"") $query .= " AND lieuid='$lieu'";
     
    $query .= " ORDER BY nom";
    Regarde le contenu de $query à ce stade (avec un print ou un echo)

    puis tu exécutes ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query($query) or die...
    Le etc... dans ma réponse initiale c'était pour t'indiquer qu'en cas de critères supplémentaires (là tu en as 3) tu pouvais continuer ainsi.

    Courage !

  5. #5
    Membre éclairé
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Par défaut
    Non, je n'arrive à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $query = "SELECT * FROM $pdpproduit WHERE 1=1";
     
    if ($style<>"") $query .= " AND styleid='$style'";
    if ($prix<>"") $query .= " AND prixid='$prix'";
    if ($lieu<>"") $query .= " AND lieuid='$lieu'";
     
    $query .= " ORDER BY nom";
     
    $result = mysql_query($query) or die("Erreur SQL !<br>".$query."<br>".mysql_error()); 
    while($data = mysql_fetch_array($result)) 
    { 
    $nom = $data["nom"]; 
    echo "> $nom";  
    }
    Ca ne renvoie aucun résultat...
    Il y a surtout que je commence à nager et je ne comprends rien à cette méthode.
    Merci quand même...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 130
    Par défaut
    Peut-on voir le contenu de la query ainsi construite ?
    Si tu exécutes cette requête directement, hors php (phpMyAdmin ou autre), donne-t-elle des résultats ?

    Bon sinon pour le code lui-même, l'objectif est donc de construire la chaine de requête par un programme. Pour régler le cas du WHERE pas forcément nécessaire (si aucun critère n'est fourni) on peut utiliser cette petite astuce du WHERE 1=1 qui à ce stade est toujours vérifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE 1=1
    renverra tous les records de la table

    Bon mais il faut bien traiter les critères. Pour cela on regarde chaque critère l'un après l'autre. S'il n'est pas vide alors on va ajouter à notre clause WHERE la partie correspondante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE 1=1 AND MonChampCritere = 'MaValeurCritere'
    Le symbole php ".=" fait simplement une concaténation de chaine. On construit la requête morceau par morceau mais de façon simple.

    Est-ce plus clair ?

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

Discussions similaires

  1. question sur les requetes table héritée
    Par champion dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 30/08/2004, 14h19
  2. Encore les requetes
    Par arsgunner dans le forum ASP
    Réponses: 22
    Dernier message: 16/06/2004, 14h59
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  4. [VB6]Prob avec les requêtes multiples
    Par cammipascal dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 30/03/2004, 18h46
  5. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39

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