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 interne de deux table, parcourt erreur [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut jointure interne de deux table, parcourt erreur
    bonjour,

    Je travail sur PHP/MySQL, je prends le temps d'examiner les jointures, ici c'est une jointure interne, de table en PHP,.
    J"ai pris l'exemple d'un jeux video. Création de deux tables : jeux_video (50 champs) et proprietaires (4 champs).
    J'ai testé ma requete sous MySql Workbench elle marche très bien.
    Lors de l'execution du programme PHP, mon log m'indique que j'ai une erreur sur le "while" :
    error: Call to a member function fetch() on boolean in /var/www/html/cours/jointure/joint_interne.php on line 34, referer: http://127.0.0.1/cours/jointure/
    Je travail sous Linux Debian 8.8 et Kate comme éditeur de code sources.
    Je me demande comme je parcourt deux tables a la fois !
    comment "while" renvoie le boolean de fin de champs?
    Voici mon code PHP :
    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
    <?php
    // Connexion à la base de données
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=jeux_video;charset=utf8', 'root', 'toto');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
    // Récupération du billet
    $reponse = $bdd->query('SELECT j.nom nom_jeu, p.prenom prenom_proprietaire &_
    FROM proprietaires p &_
    INNER JOIN jeux_video j &_
    ON j.ID_proprietaire = p.ID;
    ');
     
    // On affiche chaque entrée une à une
    while ($donnees = $reponse->fetch())
    {
       echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
                    <tr>
                         <strong> Date/heure : '.stripslashes($donnees['p.ID']).'</strong>
                    </tr>
                    <tr>
                         <strong> Ecrit par : '.stripslashes($donnees['j.nom']).'</strong>
                    </tr>
                    <tr>
                         <strong> Message : '.(stripslashes($donnees['p.prenom'])).'<strong>
                    </tr>
                </table><br />';
    }
    $reponse->closeCursor();?>

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

    1- Dans la requête, à quoi servent les "&_" ??

    2- Affichage : pas de stripslashes, mais htmlspecialchars.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Active les exceptions PDO et tu verras qu'il y a un problème avec ta requête (probablement les "&_" repérés par jreaux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bdd = new PDO('mysql:host=localhost;dbname=jeux_video;charset=utf8', 'root', 'toto');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    salut a tous, petite remarque @philo71
    1)
    tu fais une jointure ,tu obtiens donc un nouveau tableau dont les valeurs sont reçues ligne par ligne par $donnees. donc plus besoins de ['p.ID']etc.. tu l'as déjà signifié dans ta requête


    même s'il arrivait que tu es par exemple 2 tables parent et enfant avec un champ nom, dans le cas d'une jointure ça deviendrait très vite problématique surtout si nous avons affaire à select*(a eviter).(violation d’intégrité) toujours s'arranger a mettre une petite diff.

    donc finalement je propose plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while ($donnees = $reponse->fetch())
    {
       echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
                    <tr>
                         <strong> Date/heure : '.stripslashes($donnees['ID']).'</strong>
                    </tr>
                    <tr>
                         <strong> Ecrit par : '.stripslashes($donnees['nom']).'</strong>
                    </tr>
                    <tr>
                         <strong> Message : '.(stripslashes($donnees['prenom'])).'<strong>
                    </tr>
                </table><br />';
    }
    2) tu ne fais pas appel a p.ID dans ton select, donc comment pourrait'il apparaître dans ton affichage

    as tu tester ton code directement dans ta bd.
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

  5. #5
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    Dans la requête, à quoi servent les "&_"
    je suppose que c'est une manière de continuer la ligne avec son éditeur Kate sous linux comme le ferais par exemple netbeans avec ses doubles cotes et points(concatenation)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query = " SELECT *,SUM(nb_ram) AS sum  FROM periode,consommation,compte_imprimante "
            . "WHERE consommation.id_period = periode.id "
            . "AND consommation.id_cpte=compte_imprimante.id "
            . "AND  periode.date_deb_periode >= '$date2' "
            . "AND  periode.date_fin_periode <= '$date4'"
            . " GROUP BY consommation.id_cpte  "
     
            . "ORDER BY nb_ram DESC LIMIT" . " $imprimeurs  ";
    ok ancienne syntaxe mais bon
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

  6. #6
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    bonjour,
    je me demande dans quel log je peux lire les erreurs d'exceptions PDO ?
    voici mon 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    // Connexion à la base de données
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=jeux_video;charset=utf8', 'root', 'dacashAc3');
    	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
    // Récupération du billet
    $reponse = $bdd->query('SELECT j.nom nom_jeu, p.prenom prenom_proprietaire FROM proprietaires p INNER JOIN jeux_video j ON j.ID_proprietaire = p.ID');
     
     
    // On affiche chaque entrée une à une
    while ($donnees = $reponse->fetch())
    {
       echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
                    <tr>
                         <strong> ID : '.$donnees['p.ID'].'</strong>
                    </tr>
                    <tr>
                         <strong> nom jeux : '.$donnees['j.nom'].'</strong>
                    </tr>
                    <tr>
                         <strong> prénom : '.$donnees['j.prenom'].'<strong>
                    </tr>
                </table><br />';
    }
    $reponse->closeCursor();?>
    Mon log apache me sort cette erreur
    Undefined index: j.prenom in /var/www/html/cours/jointure/joint_interne.php on line 42, referer: http://127.0.0.1/cours/jointure/
    je comprens pas car j.prenom est connus !

  7. #7
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    Salut, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = $bdd->query('SELECT j.nom nom_jeu, p.prenom prenom_proprietaire FROM proprietaires p INNER JOIN jeux_video j ON j.ID_proprietaire = p.ID');
    donc tu n'auras que les donnés des champs j.nom et p.prenom.

    tu ajoutes donc j.prenom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = $bdd->query('SELECT j.nom nom_jeu, p.prenom prenom_proprietaire, j.prenom FROM proprietaires p INNER JOIN jeux_video j ON j.ID_proprietaire = p.ID');
    maintenant c'est quoi le prénom d'un jeu

    et relit le message #4
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

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

    1- la PREMIERE chose à faire, c'est de LIRE et COMPRENDRE le message d'erreur :

    Undefined index: j.prenom in /var/www/html/cours/jointure/joint_interne.php on line 42, referer: http://127.0.0.1/cours/jointure/
    • erreur : j.prenom indéfini
    • fichier : joint_interne.php
    • ligne : 42

    2- la 2ème est de REGARDER LIGNE 42 !

    Ce qu'on ne voit pas dans le code posté, qui ne fait que 32 lignes !

    3- D'autre part, on peut très bien écrire les requêtes sur PLUSIEURS lignes (et pour pouvoir les afficher, au cas où, on les met dans une variable).

    Très simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT 
       j.nom nom_jeu, 
       p.prenom prenom_proprietaire 
       FROM proprietaires p 
       INNER JOIN jeux_video j 
       ON j.ID_proprietaire = p.ID ";
    $reponse = $bdd->query( $sql );
    C'est plus clair, et facile à déboguer.

    Ou encore (avec concaténation de chaines) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT ".
       " j.nom nom_jeu, ".
       " p.prenom prenom_proprietaire ".
       " FROM proprietaires p ".
       " INNER JOIN jeux_video j ".
       " ON j.ID_proprietaire = p.ID ";
    $reponse = $bdd->query( $sql );
    4- PAS de j.prenom dans cette requête : DONC, l'erreur est AILLEURS (ligne 42 ??)

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT ".
       " j.nom nom_jeu, ".
       " p.prenom prenom_proprietaire ".
       " FROM proprietaires p ".
       " INNER JOIN jeux_video j ".
       " ON j.ID_proprietaire = p.ID ";
    $reponse = $bdd->query( $sql );
    4- PAS de j.prenom dans cette requête : DONC, l'erreur est AILLEURS (ligne 42 ??)
    Sauf si justement, l'erreur (ligne 42?) est d'essayer de lire le champ j.prenom de cette requête
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    Sauf si justement, l'erreur (ligne 42?) est d'essayer de lire le champ j.prenom de cette requête
    ouff justement l'histoire des erreurs sur lignes.
    quand on te signale une erreur à la ligne 6 alors que l'erreur est à la ligne 10 avec l’affaire des requêtes .

    vraiment embêtant pour nous autres novice
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

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

Discussions similaires

  1. Jointure internes entres 5 tables minimum
    Par The_GuiGui dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2015, 21h21
  2. Réponses: 2
    Dernier message: 06/08/2014, 19h01
  3. Jointure SQL de deux tables?
    Par nabilG dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/12/2008, 18h19
  4. Jointure SQL de deux tables?
    Par nabilG dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/12/2008, 17h31
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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