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 multi tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut requête multi tables
    Bonjour,

    Je ne parviens pas à effectuer une requête SQL portant sur plusieurs tables.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reponse = $connection->query("SELECT *
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    	WHERE T_COLLECTIONS.COLLECTION_ID = '".$_POST['selectCollection']."'
    	AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL
    	WHERE T_TITRES.COLLECTION_ID = T_COLLECTIONS.COLLECTION_ID
    	AND T_TITRES.SOUSCOLLECT_ID = T_SOUSCOLLECTIONS.SOUSCOLLECT_ID");
    Il s'agit de récupérer les champs suivants :

    - TOME ET TITRE de la table T_TITRES
    - AUTEUR de la table T_AUTEURS
    - EDITEUR de la table T_EDITEURS
    - BIBLIOTHEQUE de la table T_BIBLIOTHEQUE
    - COLLECTION de la table T_COLLECTIONS
    - SOUSCOLLECTION de la table T_SOUSCOLLECTIONS


    J'espère trouver l'aide d'une âme charitable. Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut une jointure pour chaque table en utilisant JOIN.
    Et on ne met pas directement dans une requête une donnée saisie par un utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sth = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES
            JOIN T_AUTEURS ON T_AUTEURS.TITRE_ID = T_TITRES.TITRE_ID
            ........
            WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id');
    $sth->execute(array(':collection_id'=>$_POST['selectCollection']));
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Déjà il y a deux WHERE. Un seul suffit.

    D'autres te diront qu'on ne met pas un paramètre comme tu le fais dans une requête. On utilise prepare.

    ... B

    PS : B signifie "devant C".

    PS2 : il est fatigué badaze...
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Et on ne met pas directement dans une requête une donnée saisie par un utilisateur
    Merci pour ce conseil, je ne le savais pas. Je débute en PHP.


    En suivant l'exemple de Sabotage, ma requête ne fonctionne pas.

    Ci-joint un schema de ma base de données.

    BIBLIOTHEQUE.pdf

  5. #5
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Si tu as écrit une requête poste la.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Effectivement, ce serait mieux.

    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
    if (empty($_POST['selectSousCollection'])) {
    	$reponse = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    		RIGHT JOIN T_AUTEURS ON T_AUTEURS.AUTEUR_ID = T_TITRES.AUTEUR_ID
    		RIGHT JOIN T_EDITEURS ON T_EDITEURS.EDITEUR_ID = T_TITRES.EDITEUR_ID
    		RIGHT JOIN T_BIBLIOTHEQUE ON T_BIBLIOTHEQUE.BIBLIOTHEQUE_ID = T_TITRES.BIBLIOTHEQUE_ID
    		RIGHT JOIN T_COLLECTIONS ON T_COLLECTIONS.COLLECTION_ID = T_TITRES.COLLECTION_ID
    		RIGHT JOIN T_SOUSCOLLECTIONS ON T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = T_TITRES.SOUSCOLLECT_ID
    			WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL');
    	$reponse->execute(array(':collection_id'=>$_POST['selectCollection']));
    }
    else {
    	$reponse = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    		RIGHT JOIN T_AUTEURS ON T_AUTEURS.AUTEUR_ID = T_TITRES.AUTEUR_ID
    		RIGHT JOIN T_EDITEURS ON T_EDITEURS.EDITEUR_ID = T_TITRES.EDITEUR_ID
    		RIGHT JOIN T_BIBLIOTHEQUE ON T_BIBLIOTHEQUE.BIBLIOTHEQUE_ID = T_TITRES.BIBLIOTHEQUE_ID
    		RIGHT JOIN T_COLLECTIONS ON T_COLLECTIONS.COLLECTION_ID = T_TITRES.COLLECTION_ID
    		RIGHT JOIN T_SOUSCOLLECTIONS ON T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = T_TITRES.SOUSCOLLECT_ID
    			WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = :souscollection_id');
    	$reponse->execute(array(':collection_id'=>$_POST['selectCollection']));
    	$reponse->execute(array(':souscollection_id'=>$_POST['selectSousCollection']));
    }

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pourquoi utilises tu right join plutôt que join ( ou inner join) ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    J'ai essai RIGHT JOIN, parce que JOIN ne fonctionnait pas.

  9. #9
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il te reste LEFT JOIN.... Non je rigole.

    Est-ce que si tu fais une requête toute simple cela sort quelque chose ? En d'autres termes, es-tu sûr que tu te connectes bien à la BDD ou qu'il n'y a pas d'erreur dans ta requête ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Oui, les requêtes simples fonctionnent parfaitement.

  11. #11
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Refais une requête avec JOIN et sans paramètre.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #12
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il faudrait que tu fasses ta requête dans phpmyadmin.

    Je te conseille d'y aller pas à pas.

    Tu commences par lier deux tables. Si ça va tu passes à trois, etc..
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL
    C'est quoi cette condition ? L'id d'une table ne peut pas être NULL.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Je ne suis pas chez moi. Je ferai les essais que vous me proposez en rentrant ou demain.

    C'est quoi cette condition ? L'id d'une table ne peut pas être NULL.
    Effectivement, il y'a une erreur. Ce n'est pas SOUSCOLLECT_ID de la table T_SOUSCOLLECTIONS qui peut être NULL. Ça c'est la clé primaire. C'est dans T_TITRES.

    Donc d'abord correction et ensuite je vous tiens au courant.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    J'ai donc corrigé ma requête, mais sans succès.

    Je me suis rendu compte ce matin, que, en fait, c'est la requête préparée qui ne fonctionne pas.

    J'ai procédé à un essai avec la requête que je testais à l'origine.

    C'était celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reponse = $connection->query("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = '".$_POST['selectCollection']."'
    	AND SOUSCOLLECT_ID IS NULL");
    Là, pas de problème.

    J'ai donc procédé en utilisant une requête préparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id
    	AND SOUSCOLLECT_ID IS NULL");
    $reponse->execute(array(':collection_id' => $_POST['selectCollection']));
    Et ceci ne fonctionne pas.

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    L'erreur ne me saute pas aux yeux.
    Il faudrait aller un peu plus loin que "ne fonctionne pas".

    Tu as activé les exceptions PDO ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Par contre encore une fois, les jointures se font avec JOIN pas dans le WHERE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @Neelix57.

    As tu testé ta requête dans phpmyadmin ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Il faudrait aller un peu plus loin que "ne fonctionne pas".
    La requête ne retourne aucun résultat. (Ma page reste blanche)

    Tu as activé les exceptions PDO ?
    Je viens de les activer, mais qu'est-ce que cela doit-il changer ?

    Par contre encore une fois, les jointures se font avec JOIN pas dans le WHERE
    J'avais compris, j'ai simplement réutilisé cette requête, parce que elle est opérationnelle.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Non, mais je le répète, ce n'est que la requête préparée qui ne me retourne aucun résultat.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ il faut revoir les fondamentaux :



    Et si tu reviens sans arrêt à tes anciennes requêtes (fausses, pas corrigées,...), on ne peut rien de plus pour toi.

    2/ voilà une requête SIMPLE, avec 1 paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id");
    $reponse->execute(array(':collection_id' => 25)); // (pour test, mettre un id existant effectivement en Bdd)
    $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;
    3/ Avec plusieurs paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id
    	AND SOUS_COLLECTION_ID = :sous_collection_id");
    $reponse->execute(array(
       ':collection_id' => 25,
       ':sous_collection_id' => 2
       ));
    $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;
    4/ Quant à la gestion/affichage des erreurs PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id");
    try {
       $reponse->execute(array(':collection_id' => 25)); // (pour test, mettre un id existant effectivement en Bdd)
    catch(PDOException $e){
    	echo 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage();
    }
       $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de requête multi tables
    Par arnold002 dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/03/2010, 08h24
  2. problème requête - 2 tables - count - distinct
    Par avironix2 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/12/2007, 10h16
  3. problème de requête multi-table
    Par dergips dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/07/2007, 18h21
  4. Problème requête ALTER TABLE
    Par 1tsiMat dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/06/2006, 13h16
  5. Problème DELETE multi-tables
    Par Gwipi dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/05/2006, 08h48

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