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 :

Boucle While - Afficher enregistrements SQL [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut Boucle While - Afficher enregistrements SQL
    Bonjour les amis,

    Ceci est mon premier post sur ce forum !!!

    Je poste cette discussion car je rencontre un problème sur une boucle qui permettra d'afficher les enregistrements SQL dans un tableau HTML avec une particularité :

    En effet, je voudrais afficher le résultat d'une base de données (ça je sais faire) en intercalant quelque chose après chaque enregistrement trouvé (c'est là où je cale depuis un certain temps).

    Voici les deux requêtes SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $query_selection_auteur= mysql_query("SELECT DISTINCT (t2.nom_auteur) FROM test_site_utilisateur t1, test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t2.password_examen='$password_examen' AND t2.type_devoir='2' AND matiere_cours = '' AND matiere_examen != ''") or die ("Erreur lors de la requête SQL qui permet de récupérer le nom de l'auteur"); // Envoie une requête à un serveur MySQL
     
    $query_selection_questions = mysql_query("SELECT texte_question_examen, date_depot_examen, date_examen, titre_examen,duree_examen,matiere_examen, classe_cours_examen, nom_auteur FROM test_site_utilisateur t1, test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t1.pseudo_utilisateur=t2.nom_auteur AND matiere_cours='' AND matiere_examen!='' AND t2.type_devoir='2'")or die ('Erreur lors de la requête SQL qui permet de récupérer les questions'.mysql_error()); // Envoie une requête à un serveur MySQL
    J'ai vous met la boucle que j'ai faite mais je n'arrive pas à faire comme le premier 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    while($donnees_messages = mysql_fetch_array($query_selection_questions)) {
     
    	while ($donnees_examen = mysql_fetch_array($query_selection_auteur)) {
       echo $donnees_examen['nom_auteur'];
    echo '</div></td><td width="19%"><div class="informations">Date :</div> <div class="informations_recuperees">'.$dateDuJour.'</div></tr>';
      echo '		  <tr>
    		    <td><div class="titre_examen">'.$donnees_examen['titre_examen'].'</div></td>
    		    <td colspan="2"><div class="informations">Durée : </div> <span class="informations_recuperees">'.$donnees_examen['duree_examen'].'</div></td>
    		 		  <td></td>
     
    	      </tr>
    ';
    echo '<tr><td colspan="4" class="titre_examen">'.$donnees_messages['titre_examen'].'</td></tr>';
     
    echo '  <tr>
        <td colspan="4" class="titre_question">'.$donnees_messages['texte_question_examen'].'</td></tr>';
     //echo '<tr><td colspan="4">REPONSE</td>';
     echo ' </tr>
      <tr>
        <td colspan="4" class="titre_question">'.$donnees_messages['texte_question_examen'].'</td></tr>';
     //echo '<tr><td colspan="4">REPONSE</td>';
     echo ' </tr>
      <tr>
        <td colspan="4" class="titre_question">'.$donnees_messages['texte_question_examen'].'</td></tr>';
     //echo '<tr><td colspan="4">REPONSE</td></tr>';
     echo ' 
      <tr>
        <td colspan="4" class="titre_question">'.$donnees_messages['texte_question_examen'].'</td>';
     //echo '</tr><tr><td colspan="4">REPONSE</td></tr>';
     echo ' 
      <tr>
        <td colspan="4" class="titre_question">'.$donnees_messages['texte_question_examen'].'</td>';
     }
    }
    J'ai mis en commentaire la ligne que je voudrais afficher après chaque enregistrement tant qu'il y en a.

    Pour résumer, voici les deux cas (il y en a un que je sais faire et l'autre non, c'est sur celui là que je demande votre aide !) :
    Ce que je ne sais pas faire (à l'aide ! ) :
    PREMIER ENREGISTREMENT
    élément HTML ajouté
    DEUXIEME ENREGISTREMENT
    élément HTML ajouté
    etc... (autant de fois qu'il y a des enregistrements dans la base de données)

    Ce que je ne veux pas faire dans ce cas mais ce que je sais faire :
    PREMIER ENREGISTREMENT
    DEUXIEME ENREGISTREMENT
    etc... (autant de fois qu'il y a des enregistrements dans la base de données)


    Avant de poster ce message, j'ai quand même réfléchi :
    Première solution : Pour chaque enregistrement trouvé dans la base de données, tu l'affiches et tu rajoutes l'élément HTML (donc un ) après puis tu passes à l'enregistrement suivant (incrémentation). Tu fais ça pour tout les enregistrements SQL trouvés. J'ai pensé à une boucle mais je n'arrive pas.
    Deuxième solution : Pourquoi ne pas le faire avec un compteur ? Sur un site, j'ai vu ce code (on teste si le compteur est divisible par 2 et si oui on fait un au bon endroit c'est-à-dire après chaque enregistrement (là aussi il y a un problème avec ce code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ($compteur%2 == 1) {
        echo 'Tralala';
    }
    else {
        // Résultat issu de la DB
    }


    Mais, je n'arrive pas à faire en sorte pour que ça marche pour mon cas.

    En une phrase : comment intercaler un après chaque enregistrement SQL trouvé dans une boucle ?

    Pouvez-vous m'aider ?
    Comment faire le premier cas ?

    Cordialement

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    va falloir te plonger un peu dans le sql
    Normalement tu devrais être capable de rapatrier toutes les données en un seul appel en faisant appel aux jonction entre tables.
    Je t'ai mis au propre tes requêtes SQL pour que tu te rendes comptes qu'il y a un problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $sql_auteur = <<<SQL
    SELECT DISTINCT (t2.nom_auteur)
      FROM
           test_site_utilisateur t1,
           test_site_questions   t2
     WHERE
           t1.pseudo_utilisateur  = '$pseudo_utilisateur'
           AND t2.password_examen = '$password_examen'
           AND t2.type_devoir     = '2'
           AND matiere_cours      = ''
           AND matiere_examen    != ''
    SQL;
    dans cette requête les tables t1 et t2 ne sont pas jointes : cela équivaut à faire un produit cartésien entre les deux tables. Je ne suis pas sûr que c'est ce que tu veux...

    L'autre morceau :
    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
    $sql_questions = <<<SQL
    SELECT
           texte_question_examen,
           date_depot_examen,
           date_examen,
           titre_examen,
           duree_examen,
           matiere_examen,
           classe_cours_examen,
           nom_auteur
      FROM
           test_site_utilisateur t1,
           test_site_questions t2
     WHERE
           t1.pseudo_utilisateur     = '$pseudo_utilisateur'
           AND t1.pseudo_utilisateur = t2.nom_auteur
           AND matiere_cours         = ''
           AND matiere_examen       != ''
           AND t2.type_devoir        = '2'
    SQL;
    Tu fais la jonction dans la clause WHERE ! Il est largement préférable de la faire dans la clause FROMEnfin, il serait utile de définir des alias plus explicites en lieu et place de t1, t2...

    Pourrais-tu poster la DDL de tes tables : test_site_utilisateur et test_site_questions

    NB : les fonctions mysql_xxx sont obsolètes, tu devrais passer soit à PDO soit aux fonctions mysqli_xxx

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Merci de ta réponse

    Concernant la première requête SQL, j'ai juste remplacé nom_auteur par nom_auteur_examen, la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT (t2.nom_auteur_examen) FROM test_site_utilisateur t1, test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t2.password_examen='$password_examen' AND t2.type_devoir='2' AND matiere_cours = '' AND matiere_examen != ''
    Voici la deuxième requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT(texte_question_examen),date_depot_examen,date_examen,titre_examen,duree_examen,matiere_examen,classe_cours_examen,nom_auteur_examen FROM test_site_utilisateur t1,test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t2.password_examen='$password_examen' AND t1.pseudo_utilisateur=t2.nom_auteur_examen AND matiere_cours='' AND matiere_examen!='' AND t2.type_devoir='2'
    J'ai rajouté t1 et t2 pour pouvoir faire les jointures entre les tables plus rapidement.

    Ce que tu me dis, ça me parait étrange car quand je teste les deux requêtes SQL sur PHPMyAdmin, elles fonctionnent !

    J'arrive à afficher les enregistrements mais je n'arrive pas à ajouter quelque chose après chaque enregistrement trouvé.

    En PHP, est-ce que c'est possible d'intervenir après chaque enregistrement SQL trouvé dans une boucle ?

    Cordialement

  4. #4
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    si tu initialise le compteur mais surtout que tu l'incrémente, ça devrait fonctionner
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $compteur=0;
    if ($compteur%2 == 1)
     { 
      echo 'Tralala'; 
      $compteur+=1;
      } 
    else { // Résultat issu de la DB }

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bon, vu que je n'ai jamais été très doué pour le jeu des devinettes et ne sachant pas trop où tu voulais en venir, j'ai repris ton code en le présentant lisiblement et malgré ça, j'ai du mal à te comprendre :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    $sql = <<<SQL
    SELECT
           texte_question_examen,
           date_depot_examen,
           date_examen,
           titre_examen,
           duree_examen,
           matiere_examen,
           classe_cours_examen,
           nom_auteur
      FROM
           test_site_utilisateur u
               INNER JOIN test_site_questions q ON u.pseudo_utilisateur = q.nom_auteur
     WHERE
           u.pseudo_utilisateur  = '$pseudo_utilisateur'
           AND q.password_examen = '$password_examen'
           AND matiere_cours     = ''
           AND matiere_examen   != ''
           AND q.type_devoir     = '2'
    ORDER BY
           nom_auteur
    SQL;
     
    $qry = mysql_query($sql) or die(mysql_error());
     
    while ($data = mysql_fetch_assoc($qry))
    {
        echo <<<HTML
                {$data['nom_auteur']}
            </div>
        </td>
        <td width="19%">
            <div class="informations">Date :</div>
            <div class="informations_recuperees">{$dateDuJour}</div>
    </tr>
    <tr>
        <td><div class="titre_examen">{$data['titre_examen']}</div></td>
        <td colspan="2">
            <div class="informations">Durée : </div>
            <span class="informations_recuperees">{$data['duree_examen']}</div>
       </td>
       <td></td>
    </tr>
     
     
    <tr><td colspan="4" class="titre_examen">{$data['titre_examen']}</td></tr>
    <tr><td colspan="4" class="titre_question">{$data['texte_question_examen']}</td></tr>
    <tr><td colspan="4">REPONSE</td></tr>
    <tr><td colspan="4" class="titre_question">{$data['texte_question_examen']}</td></tr>
    </tr>
    <tr><td colspan="4" class="titre_question">{$data['texte_question_examen']}</td></tr>
    <tr><td colspan="4" class="titre_question">{$data['texte_question_examen']}</td>
    <tr><td colspan="4" class="titre_question">{$data['texte_question_examen']}</td>
    HTML;
    }
    Sache qu'il est possible de tout rapatrier en une seule requête (mais vu qeu tu ne veux pas donner la DDL de tes tables... tu devras te débrouiller seul). Explique aussi mieux ta cuisine sur le changement d'auteur.

    Ensuite ton HTML est mal formé : relis-le et tu verras les coquilles
    Enfin, tu devrais songer à échapper au moins tes données avec htmlspecialchars()

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Comme demandé, je vous mets les deux .

    Sinon, voici la requête SQL qui permet de récupérer les questions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	$query_selection_questions_examen = mysql_query("SELECT DISTINCT(texte_question_examen),date_depot_examen,date_examen,titre_examen,duree_examen,matiere_examen,classe_cours_examen,nom_auteur_examen FROM test_site_utilisateur t1,test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t2.password_examen='$password_examen' AND t1.pseudo_utilisateur=t2.nom_auteur_examen AND matiere_cours='' AND matiere_examen!='' AND t2.type_devoir='2'")or die ('Erreur lors de la requête SQL qui permet de récupérer les questions d\'un examen'.mysql_error()); // Envoie une requête à un serveur MySQL
    Voici la boucle que j'ai faite :
    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
     
    echo '<table width="100%" border="1">';
    		while($donnees_examen = mysql_fetch_assoc($query_selection_questions_examen)){
     
    $compteur=0;
    if ($compteur%2 == 1)
     { 
      echo 'Tralala'; 
      $compteur+=1;
      } 
    else { // Résultat issu de la DB 
     
    echo '  <tr>
        <td colspan="4" class="titre_question">'.$donnees_examen['texte_question_examen'].'</td></tr>';
     
    }}
    echo '</table>';
    Avec ce code, ça affiche les questions mais le compteur ne marche pas ce qui est logique car c'est un test .

    Pouvez-vous m'aider SVP ?

    Cordialement

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Re bonjour

    Je reviens vers vous avec ce code (une boucle ) qui, a priori, fonctionne mais je voudrais que le champs texte s'affiche sur une autre ligne (en dessous de la question : donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tr><td><input type="text" /></td></tr>
    alors qu'avec ce code : le champs texte s'affiche sur la même ligne que la question.

    Voici les deux requêtes SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $query_selection_auteur= mysql_query("SELECT DISTINCT (t2.nom_auteur_examen) FROM test_site_utilisateur t1, test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t2.password_examen='$password_examen' AND t2.type_devoir='2' AND matiere_cours = '' AND matiere_examen != ''") or die ("Erreur lors de la requête SQL qui permet de récupérer le nom de l'auteur"); // Envoie une requête à un serveur MySQL
     
    $query_selection_questions = mysql_query("SELECT texte_question_examen, date_depot_examen, date_examen, titre_examen,duree_examen,matiere_examen, classe_cours_examen, nom_auteur FROM test_site_utilisateur t1, test_site_questions t2 WHERE t1.pseudo_utilisateur='$pseudo_utilisateur' AND t1.pseudo_utilisateur=t2.nom_auteur AND matiere_cours='' AND matiere_examen!='' AND t2.type_devoir='2'")or die ('Erreur lors de la requête SQL qui permet de récupérer les questions'.mysql_error()); // Envoie une requête à un serveur MySQL
    Voici le code, la boucle en intégralité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $nombredequestions = mysql_num_rows($query_selection_questions_examen);
    $champdereponse = '<input type="text" />';
    for ($i = 0; $i < $nombredequestions; $i++) {
    while($donnees_examen = mysql_fetch_assoc($query_selection_questions_examen)) {
    	echo '<tr><td colspan="4" class="titre_question_examen">'.$donnees_examen['texte_question_examen'].$champdereponse.'</td></tr>';
     
    //echo $donnees_examen['texte_question_examen'] . $champdereponse;
    }
    }
    Je comprends pourquoi, c'est parce que je concatène la question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $donnees_examen['texte_question_examen']
    et .

    En une phrase : comment faire pour séparer les questions et les zones de texte (pour que ça fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tr><td>Question</td></tr><tr><td>Zone de texte</td></tr>
    ) ?

    Cordialement

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    A confirmer et à tester (avec d'autres valeurs) mais à priori le code fonctionne !

    J'ai réussi à séparer les questions et les zones de texte avec cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    echo '<table width="100%" border="1">';
    $nombredequestions = mysql_num_rows($query_selection_questions_examen);
    $champdereponse = '<input type="text" />';
     
    for ($i = 0; $i <= $nombredequestions; $i++) {
    while($donnees_examen = mysql_fetch_assoc($query_selection_questions_examen)) {
    	echo '<tr><td colspan="4" class="titre_question_examen">'.$donnees_examen['texte_question_examen'].'</td></tr><tr><td colspan="4" class="">'.$champdereponse.'</td></tr>';
    }
    }
    echo '</table>';
    Cordialement

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 11/05/2007, 15h28
  2. [MySQL] Comment débuter une boucle WHILE à partir du 2e enregistrement de la table ?
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 06/03/2007, 17h51
  3. Requete SQL dans boucle while
    Par vince_grenoblois dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 04/08/2006, 20h41
  4. [T-SQL]Skipper un tour de boucle while
    Par agougeon dans le forum Sybase
    Réponses: 2
    Dernier message: 04/08/2006, 13h26
  5. [T-SQL]pb boucle while
    Par agougeon dans le forum Sybase
    Réponses: 1
    Dernier message: 24/07/2006, 12h05

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