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 :

Accès table supplémentaire [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut Accès table supplémentaire
    Bonjour à tous,

    J'écris ce petit mot car j'ai un petit soucis de requête. Pour un besoin x, j'ai codé une requête qui fonctionne très bien, générée dynamiquement par php. Hors je me suis décidé à ajouter un paramètre supplémentaire qui fait que la requête ne fonctionne plus. Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    		$statabsenteisme_req = "SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux
    								FROM gm_arret AS ar 
    								INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
    								INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ";
     
    		if($type == 'prolongation')
    		{
     
    		}
     
    		else
    		{
    			$statabsenteisme_req .= " INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ";
    		}
    [...]

    [...]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		if($type == 'prolongation')
    		{
    			$statabsenteisme_req .= " OR ar.indice_prolongation ='1'";
    		}
    		$statabsenteisme_req .= " AND co.complet IN(1,2,3,4)";
    		$statabsenteisme_req .= " ORDER BY ca.nom_agent ASC";	
    		$statabsenteisme_sql = mysql_query($statabsenteisme_req);
    Vous noterez que la table gm_complet selon le type n'est pas déclarée. Le problème c'est que je ne vois pas comment la rajouter pour que cela fonctionne.

    Auriez vous une idée ? Merci par avance.

    Cdt,

    Tux

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Il va falloir que tu nous montres ce qu'il y a entre les 2, ça vient sûrement de qu'il y a avant le '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

    - Soit tu répète la condition autant de fois que c'est nécessaire sur "prolongation" tout en respectant la structure de la requête.
    Moins pratique à mon sens.

    - Soit, (ce qui me semble mieux car ça offrira plus de souplesse quand on crée une requête dynamique) tu éclate les choses selon la structure de la requête.
    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
    16
    17
    18
    19
    20
    21
    22
     
    $select = 'SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux ';
    $from = 'FROM gm_arret AS ar ';
    $join = 'INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
    INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ';
    $where = 'WHERE ';
    $clause = '';
    $order_by = 'ORDER BY ca.nom_agent ASC ';
    //
     
    if ($type == 'prolongation') {
        $join .= 'INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ';
        $where = '... etc ...';
        $clause .= "OR ar.indice_prolongation ='1' ";
        $clause .= 'AND co.complet IN(1,2,3,4) ';
    }
    else {
       // ...Autres intégrations si c'est le cas ...
    }
     
    // Reconstitution des éléments
    $sql = $select.$from.$join.$where.$clause.$order_by;
    Quelque chose dans ce genre là, faut adapter selon les conditions.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Pour faire plus court je vais afficher les deux requêtes.

    Le premier choix qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux 
    FROM gm_arret AS ar 
    INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent 
    INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent 
    INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret 
    WHERE af.num_ucf = '1' 
    AND co.complet IN(1,2,3,4) 
    ORDER BY ca.nom_agent ASC
    Le second choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux 
    FROM gm_arret AS ar 
    INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent 
    INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent 
    WHERE af.num_ucf = '1' 
    OR ar.indice_prolongation ='1' 
    AND co.complet IN(1,2,3,4) 
    ORDER BY ca.nom_agent ASC
    Dans le second cas, la table gm_complet n'est pas déclarée. D'où l'erreur mysql_num_rows(): supplied argument is not a valid MySQL result resource.

    J'avais pensé à INNER JOIN gm_complet AS co sans ON mais ça ne fonctionne pas :/

    Le passage intermédiaire de la requête a toujours fonctionné et est indépendant si je puis dire de mon problème. Cette partie manquante est assez conséquente, mais si ya vraiment besoin, je la poserai également.

    Cdt

  5. #5
    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
    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
     
    $select = 'SELECT ar.date_debut, ar.date_fin, ar.nni_agent, ar.intitule, ar.indice_prolongation, ar.code,ca.nom_agent, ca.taux ';
    $from = 'FROM gm_arret AS ar ';
    $join = 'INNER JOIN commun_agent AS ca ON ca.nni_agent = ar.nni_agent
    INNER JOIN commun_affecter as af ON ar.nni_agent = af.nni_agent ';
    $where = "WHERE af.num_ucf = '1' ";
    $clause = '';
    $order_by = 'ORDER BY ca.nom_agent ASC ';
    //
     
    if ($type == 'prolongation') {
        $join .= 'INNER JOIN gm_complet AS co ON co.id_arret = ar.id_arret ';
        $clause .= 'AND co.complet IN(1,2,3,4) ';
    }
    else {
        $clause .= "OR ar.indice_prolongation ='1' ";
     
        // Ici le co.complet cause problème.
        // Faut voir
        $clause .= 'AND co.complet IN(1,2,3,4)';
    }
     
    $sql = $select.$from.$join.$where.$clause.$order_by;
    Effectué un peu vite fait, mais ça ne doit pas être trop loin.


    Mais le "co.complet" cause problème dans la 2ème condition, la table "gm_complet" ne s'y trouve pas, or, dans ton exemple elle s'y trouve dans les 2 cas.
    Faut faire le point la dessus.
    Soit ce champ/clause, il ne faut pas rajouter dans ce cas là, soit ce champ "complet" peut être exploiter autrement, faut voir.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Je suis navré RunCodePhp mais j'ai énormement de mal à procéder comme tu le fait. Ma requête étant assez monstrueuse, je suis pas sur de pouvoir adapter ta méthode à la requête.

    Une petite question tout de même, peut être que ça eclairera sur le problème.

    J'ai lu sur une page sql qu'il était possible d'accéder à deux tables de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT animal.nom,
        -> (TO_DAYS(date) - TO_DAYS(naissance))/365 AS age,
        -> remarque
        -> FROM animal, evenement
    Est-ce que cette méthode pourrait s'appliquer à ma requête ( je demande parce que j'ai testé et ça marche pas ^_^' mais on sait jamais ), pour obtenir quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM gm_arret AS ar, gm_complet AS co
    ou encore un INNER JOIN tout simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN gm_complet AS co
    ?

    Je pose ces questions car je suis pas sûr d'avoir saisi le principe de l'accès multiples aux tables, malgré avoir réussi à avoir un résultat jusqu'à présent.

    Merci par avance.

    Petit edit : lorsque que j'ai linké les requetes SQL choix 1 et 2, j'ai involontairement inversé les deux, ce qui permettra de mieux comprendre l'erreur de l'absence de déclaration de table manquante.

  7. #7
    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
    Je suis navré RunCodePhp mais j'ai énormement de mal à procéder comme tu le fait. Ma requête étant assez monstrueuse, je suis pas sur de pouvoir adapter ta méthode à la requête.
    C'est dommage car c'est la manière la plus naturelle et logique de découper un chaine SQL.

    Dans les code sObjets (POO) on retrouve très souvent le même principe, ce n'est pas hasard car le SQL (pour un SELECT du moins), la structure est la suivante :
    SELECT (les champs)
    FROM (les tables)
    (INNER/LEFT OUTER/RIGHT OUTER) JOIN (les jointures)
    WHERE (les clauses)
    GROUP BY (les regroupements)
    ORDER BY (les tri)
    LIMIT (délimitation)

    Et en POO ça donne des codes du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $sql->select('les champs')
         ->from('les tables')
         ->join('les jointures')
         ->where('les clauses')
         ->groupby('les regroupement')
         ->order_by('les tri');
    Ca ressemble étrangement à ce que j'ai mis et aussi à ce que tu dis.
    Mais c'est pas du SQL à proprement parlé, c'est des classes Objets qui sont conçues comme ça pour justement éviter une chaine d'un seul bloc qui à juste titre n'est pas pratique dans un cas comme le tiens.
    Découper la requête de manière logique devient par moment nécessaire.


    Mais le vrai problème que je remarque, c'est dans ton 2ème cas tu prévois de faire une clause : co.complet IN(1,2,3,4)
    Pour ma part il n'y a pas 36 solutions :
    - Soit il faut rajouter cette table "gm_complet" pour ensuite rajouter cette clause/condition
    - Soit il ne faut pas rajouter cette table et encore moins cette condition.

    Mais c'est en expriment ton besoin qui va le déterminer, pas en bidouillant le SQL.
    Quitte à l'écrire sur un bloc note quand on a un peu de mal, car il n'y a pas besoin de faire du code pour exprimer les résultats voulu.


    En tout cas on ne pourra deviner la requête qui serait à faire si on ne connait pas les résultat qui seraient à obtenir.
    Dans un cas comme ça, il peut être utile de fournir ce qu'on appel un jeu d'essai, c'est à dire une liste (simple) des lignes des tables :
    - D'un coté les résultats qu'on souhaite dans le cas 1
    - De l'autre, les résultats du cas 2, on montrant bien ce qui doit être récupérer ou à exclure par rapport au cas 1 pour bien voir la différence.


    Truc pratique, c'est de faire les 2 requêtes (les 2 cas) dans PhpMyAdmin, en vérifiant bien que les résultat/lignes soient correctes.
    Le but est d'obtenir 2 chaines de requêtes totalement fonctionnelles.
    De la même manière que tu as mis précédemment, mais sans erreurs.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Salut RunCodePhp

    J'ai lu avec attention ton post. D'après tes dires, la construction que j'ai faite n'est pas la plus appropriée, du moins n'est plus. Elle avait une fonction au départ, maintenant elle doit en avoir deux et effectivement ma méthode ne fonctionne plus. Pourtant, malgré que le soucis me paraisse simple, cela reste éminement compliqué. Je dois accéder à une table, mais le seul moyen d'y accéder est la condition inverse à ce dotn j'ai besoin, c'est à s'arracher les cheveux

    Néanmoins, je vais essayer d'appliquer ta méthode et suivre tes conseils voir si j'arrive à un résultat différent, plus performant.

    Je repasse donner mes résultat rapidement.

    Merci une fois de plus en tout cas

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Par défaut
    Re bonjour RunCodePhp

    Je viens un peu donner des nouvelles! En fait, mon problème s'est étendu à plusieurs pages. La table gm_complet est en fait comme un petit satellite et est quasi inaccessible. Elle répondait à des besoin fixes et a été créée telle qu'elle. Dès que j'ai dû y avoir accès, je me suis retrouvé au même problème, impossible à déclarer, ni à jointer. Son utilité posant problème lors d'un appel en particulier, ben j'ai supprimé définitivement ces besoins, rejoingnant un peu ce que tu as dis : "Soit il ne faut pas rajouter cette table et encore moins cette condition."

    En tout cas merci infiniment pour les explications, même si la solution n'a pas été trouvée, j'y vois déjà bien plus clair dans la conception de requête.

    Je repasserai pour noter le message en résolu.

    Merci à tous

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

Discussions similaires

  1. accès tables sql server depuis oracle par dblink
    Par totof31 dans le forum Administration
    Réponses: 1
    Dernier message: 09/05/2007, 08h59
  2. ACCES + Tables liées SQLServer 2000
    Par zakori dans le forum Access
    Réponses: 2
    Dernier message: 25/01/2006, 08h19
  3. Probleme Acces Table
    Par jmjmjm dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/12/2005, 21h24
  4. [MySql/PHPMyAdmin]nouvel utilisateur et acces table
    Par Bug's Bunny dans le forum Débuter
    Réponses: 6
    Dernier message: 28/07/2004, 14h03
  5. [Sybase] Accès Table sur serveur distant
    Par MashiMaro dans le forum Sybase
    Réponses: 5
    Dernier message: 11/02/2004, 14h09

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