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

  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 ?

  7. #7
    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
    Oui, c'est un peu plus clair, merci de ta patience.
    Je vais essayer de résoudre tout ça...

  8. #8
    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
    Bah ça ne me dis grand-chose, ce echo $query;
    Cela me renvoie une erreur... Je suis largué...

  9. #9
    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
    Salut !

    On cherche à construire notre requête ($query) par programme. Cela ne fonctionne pas comme on voudrait alors on va vérifier que notre programme a construit une requête correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $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";
     
    echo $query;
    Ceci doit t'afficher sur l'écran le texte de ta requête. Si tu peux coller le résultat ici on y verra déjà plus clair et si tu testes cette requête en dehors de php directement sur MySql (avec phpMyAdmin par exemple) tu sauras ce qu'elle retourne exactement.

    Tu supprimes la suite du script temporairement en laissant simplement la fin de script : ?>

    Tiens au fait c'est quoi $pdpproduit ? Une variable qui contient ton nom de table ? Tu ne peux pas mettre le nom de la table directement (au moins pour tester) ?

    Si tout ceci ne fonctionne pas ou te retourne une erreur, donne le texte précis de l'erreur, donne également peut-être le nom de ta base, de ta table et montre le script en entier.

    Sacrebleu on va trouver

  10. #10
    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
    Alors, la requête sous phpmyadmin donne ceci :

    $query = "SELECT * FROM $pdpproduit WHERE 1=1"


    et la réponse mysql :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$query = "SELECT * FROM $pdpproduit WHERE 1=1"' at line 1

    Quant à pdpproduit, c'est le nom de la table...

  11. #11
    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
    "Mais alors, mais c'est bien sûr..."
    Pourquoi dans ce cas un "$" devant le nom de la table ?
    En php c'est le signe d'une variable, retire ce $ et tout devrait aller mieux

  12. #12
    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
    C'est bizarre, le $ ne change rien, si on l'enlève...
    Cela dit, on a avancé, en ajoutant une clause à la requête.
    Merci encore pour ton aide.

  13. #13
    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
    Bonjour

    Bon j'imagine que la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM pdpproduit WHERE 1=1
    fonctionne maintenant correctement dans phpMyAdmin.

    Si le reste n'est pas résolu il faut donc retirer ce $ avant le nom de table dans le source php puis faire un test du formulaire avec la saisie de critères avec mon code

    Si tu n'obtiens pas le résultat attendu, il faut
    - regarder le contenu de $query (avec echo ou print)
    - exécuter la requête avec phpMyAdmin pour voir si elle retourne ce que tu attends.
    - si ce n'est pas bon, poste un exemple de requête qui ne fonctionne pas comme tu veux ainsi que la structure de ta table.

    Ah oui encore un point qui pourrait expliquer tes soucis, il faut initialiser ces variables de requête AVANT de construire $query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!isset($style)) $style="";
    if (!isset($prix)) $prix="";
    if (!isset($lieu)) $lieu="";
     
    $quey="..."
    Si tout est ok alors tant mieux et on peut fermer le topic !

  14. #14
    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
    Oui, c'est bon après correction de la base et du formulaire de recherche.
    Merci pour tout !

+ 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