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 :

Jointure multiple : une table capricieuse [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Jointure multiple : une table capricieuse
    Bonjour,

    je possède trois tables:
    1. taches
    2. utilisateurs
    3. taches_type


    'taches' possède une clé étrangère de chacune des deux autres:
    • taches.charge_affaire = utilisateurs.id
    • taches.type_action = taches_types.id


    je souhaite afficher des champs sur ces trois tables dont voici la jointure avec php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $select = self::dbSelect(array(
                    "SELECT" => "taches.date_action, taches.contact, taches.commentaire, utilisateurs.nom_complet, taches_types.nom",
                    "FROM" => "(taches",
                    "INNER JOIN" => "utilisateurs",
                    "ON" => "taches.charge_affaire = utilisateurs.id)",
                    "INNER JOIN" => "taches_types",
                    "ON" => "taches.type_action = taches_types.id",
                    "WHERE" => "taches.id_client = ".$idClient
                ));
    j'obtiens l'erreur:
    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 'WHERE taches.id_client = 100012' at line 1
    j’obtiens pourtant un résultat lorsque j'enlève
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "INNER JOIN" => "taches_types",
                    "ON" => "taches.type_action = taches_types.id",
    J'ai vérifié le type des variables dans la bdd.

    Comme vous le constatez j'ai également essayé avec les parenthèses nécessaires à certaines versions de mysql mais rien n'y fait je ne trouve pas mon erreur

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    D'un point de vue purement SQL, ta requête semble correcte.
    As-tu essayé de l'exécuter hors de ton programme, directement dans l'interpréteur de commandes de MySQL ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Très bonne idée !
    Je viens de tester et ça marche

    Pour le coup je pense que mon probleme vient de $idClient
    pourtant je pense avoir bien vérifier les types

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    je viens de reverifier

    J'ai utilisé intval($idClient, 10)
    et ai meme entré directement la valeur de l'id à la main mais toujours la meme erreur =/

    pourtant le champ est bien un int

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    tes parenthèses dans le sql ???

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM ( table INNER JOIN ... ) INNER JOIN ...
    $moi= ( !== ) ? : ;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par papajoker Voir le message
    tes parenthèses dans le sql ???
    Je les ai ajoutées après quelques recherches

    Elles permettraient d'éviter les incompatibilités avec certaines versions de mysql

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Est-ce tu peux afficher la requête générée par ton objet ?
    Vive les roues en pierre

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Je ne suis pas sûr de comprendre ta question
    Tu veux parler de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $select = self::dbSelect(array(
        "SELECT" => "taches.date_action, taches.contact, taches.commentaire, utilisateurs.nom_complet, taches_types.nom",
        "FROM" => "(taches",
        "INNER JOIN" => "utilisateurs",
        "ON" => "taches.charge_affaire = utilisateurs.id)",
        "INNER JOIN" => "taches_types",
        "ON" => "taches.type_action = taches_types.id",
        "WHERE" => "taches.id_client = ".$idClient
    ));
    Si je decortique le sql donne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT taches.date_action, taches.contact, taches.commentaire, utilisateurs.nom_complet, taches_types.nom
    FROM (taches
    INNER JOIN utilisateurs
    ON taches.charge_affaire = utilisateurs.id)
    INNER JOIN taches_types
    ON taches.type_action = taches_types.id
    WHERE taches.id_client = 100012

    Si c'est bien ce que tu demandais...

  9. #9
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    En fait c'est quoi que t'utilises comme API PHP SQL ?
    Apparemment tu es dans une classe qui hérite d'une méthode dbSelect() ?
    Est-ce que tu as une méthode dans cet objet qui te permet de voir la requête réelle envoyée au serveur ?

    D'ailleurs dbSelect() on dirait une méthode pour sélectionner la database et pas pour faire un Select SQL, t'es sûr que tu t'es pas planté de méthode ? ^^
    Vive les roues en pierre

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    En fait c'est quoi que t'utilises comme API PHP SQL ?
    Je suis sur un serveur IIS 8
    Avec phpmyadmin

    Citation Envoyé par Djakisback Voir le message
    Apparemment tu es dans une classe qui hérite d'une méthode dbSelect() ?
    ...
    t'es sûr que tu t'es pas planté de méthode ? ^^
    non non j'en suis certain

    J'ai reussi à executer la requete !

    En fait c'est mon prédécesseur qui a créé la classe de gestion de la base de donnee. Sauf qu'il a forcé à fournir un tableau associatif en parametre alors pour le coup c'est plus dur de voir ses erreurs (mem l'ide ne reconnait pas le sql pour le coup...)

    Il devait y avoir une faute mais meme en regardant maintenant encore je ne la trouve pas xD

    J'ai contourné le probleme en bidouillant ce que je passe en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $select = self::dbSelect(array(
                    "" => "SELECT taches.date_action, taches.contact, taches.commentaire, utilisateurs.nom_complet as charge_affaire, taches_types.nom as type_action
                    FROM taches
                    INNER JOIN utilisateurs
                    ON taches.charge_affaire = utilisateurs.id
                    INNER JOIN taches_types
                    ON taches.type_action = taches_types.id
                    WHERE taches.id_client = " . $idClient
                ));
    Voilà

    Merci à tous pour votre aide
    Je coche discussion résolue

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

Discussions similaires

  1. Plusieurs jointures sur une table
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/09/2006, 15h23
  2. Probleme jointure d'une table sur elle même
    Par fred64 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/05/2006, 15h01
  3. Réponses: 1
    Dernier message: 18/01/2006, 17h51
  4. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2005, 23h54
  5. [arborescence] jointure d'une table avec elle même ?
    Par Celelibi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/11/2004, 18h48

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