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 :

Fonctionnement de mysql_fetch_assoc [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 402
    Par défaut Fonctionnement de mysql_fetch_assoc
    Bonsoir,

    Le code suivant m'affiche le nombre de livres édités par un éditeur et le titre de chacun :

    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
    <?php
     
     
     
    $db = mysql_connect("localhost","root", "")  or die ('erreur de connexion');
    mysql_select_db('***',$db);
     
     
    $select_livre = "SELECT L.TITRE AS titre, L.ID_LIVRE AS id_livre,
    ED.NOM_EDITEUR AS editeur, ED.ID_EDITEUR AS id_editeur
     
    FROM LIVRE L
    
    INNER JOIN EDITEUR ED		
    ON ED.ID_EDITEUR = L.ID_EDITEUR	";
     
    $ID_EDITEUR= (iSset($_GET['id_editeur']) ? $_GET['id_editeur'] : null);
     
    if ( $ID_EDITEUR != null) { // on ajoute le critère que s'il est demandé
     
      $select_livre  .= " WHERE ED.ID_EDITEUR=".$ID_EDITEUR;
    }
     
    $resultat_livre = mysql_query($select_livre)or die('Erreur SQL !'.$select_livre.'<br>'.mysql_error());
     
    $nblignes = mysql_num_rows($resultat_livre);
     
    $data = mysql_fetch_assoc($resultat_livre);
     
     
    if ( $ID_EDITEUR != null) {
     
    echo '<strong>Editeur '.$data['editeur'].' : </strong/>' .$nblignes .' occurrence(s) <br/>'; }
     
    while ($data = mysql_fetch_assoc($resultat_livre)) {
       echo '<br/><h3>'.$data['titre'] . '</h3>'; }
    ?>

    Editeur Michel Lafon : 3 occurrence(s)

    titre1
    titre2
    titres3

    Ce qui est conforme à mes attentes. Mais en testant plus avant, je me suis rendu compte que s'il n'y avait qu'un seul livre édité par un éditeur, je perdais l'affichage du titre :

    Editeur Lattès : 1 occurrence(s)

    => le titre de ce livre ne s'affiche pas...

    Un echo de la requête donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT L.TITRE AS titre, L.ID_LIVRE AS id_livre, ED.NOM_EDITEUR AS editeur, ED.ID_EDITEUR AS id_editeur FROM LIVRE L INNER JOIN EDITEUR ED ON ED.ID_EDITEUR = L.ID_EDITEUR WHERE ED.ID_EDITEUR=183
    Voyez-vous une explication à ce phénomène ? Merci d'avance.

  2. #2
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ... code ...
    $data = mysql_fetch_assoc($resultat_livre); // ceci n'est pas nécessaire.
     
    ...code ...
     
    while ($data = mysql_fetch_assoc($resultat_livre)) {
       echo '<br/><h3>'.$data['titre'] . '</h3>'; }
    ?>
    Tu applique 2 fois mysql_fetch_assoc(), alors qu'1 seule fois suffit, dans la boucle.

    Théoriquement, quand tu l'applique la 1ère fois, $data contiendra le 1er tuple (indice 0).
    Ensuite, ça commencera au 2ème tuples (indide 1) dans la boucle.
    C'est d'ailleurs ce qu'il se passe dans la boucle : tant que mysql_fetch_assoc() retourne un tuple, ça passe au suivant, jusqu'au dernier.

    Essai de faire comme ceci, tu devrais le remarquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $data = mysql_fetch_assoc($resultat_livre);
    print_r($data); // 1ère ligne
     
    $data = mysql_fetch_assoc($resultat_livre);
    print_r($data); // 2ère ligne
     
    $data = mysql_fetch_assoc($resultat_livre);
    print_r($data); // 3ère ligne
     
    ... etc jusqu'au dernier ...
    J'ai jamais essayé à vrai dire, mais c'est ce qu'il devrait se passer théoriquement.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 402
    Par défaut
    Merci pour l'explication. J'ai compris mon erreur

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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