Inscription tableau PHP

Résolu
Bonjour,

je galère depuis un petit moment sur un problème qui va surement vous sembler "débile" mais je suis débutant en PHP :)

Présentation du projet :

Premièrement, je récupère les données dans une BDD MySQL, que je trie en fonction de la date, bref je ne pense pas que cela soit très important.

Ensuite j'ai une page "web", contenant un tableau PHP, voici un bout de code que j'ai utilisé pour faire le tableau :

<table style="width:100%; font-size: 12px>
<tr style="font-style:bold;"><td>Num.</td><td>Nom</td><td>Prenom</td><td>Stagiaire</td> ...
</table>

J'espère que c'est compréhensible.

Voilà, maintenant c'est que je cherche à faire, c'est remplir ce tableau avec les données que je récupère dans la BDD (un enregistrement BDD -> Une ligne du tableau).

Merci de votre aide.

10 réponses

Résumé de la discussion

Le problème discuté est le remplissage d'un tableau HTML à partir de données MySQL récupérées en PHP, triées par date et affichées ligne par ligne. Plusieurs conseils préconisent d'utiliser une boucle while sur les résultats et de construire chaque ligne avec les balises tr et td, récupérant les champs via mysql_fetch_array et echo htmlspecialchars. D'autres échanges soulignent des erreurs de synchronisation entre en-têtes et données et des soucis de syntaxe PHP (parse error, balises mal ouvertes), recommandant d'aligner correctement les noms de champs. En pratique, l'option retenue insiste sur l'exemple d'affichage des colonnes dans l'ordre approprié et sur l'utilisation d'un SELECT avec les bons noms, afin d'assurer la correspondance entre en-têtes et valeurs.

Bobot (l’IA à votre service)
  1. Un truc du genre je pense:

    <table style="width:100%; font-size: 12px>		
    
    <?php
    		// Connexion à la base de données
    		try
    		{
    			$bdd = new PDO('mysql:host=HOST;dbname=DBNAME', 'LOGIN', 'MDP');
    		}
    		catch(Exception $e)
    		{
    				die('Erreur : '.$e->getMessage());
    		}
    		// Fin de connexion à la base
    		
    		// Récupération des info
    		$req = $bdd->query('SELECT Num, nom, prenom, stagiaire FROM ma table ORDER BY Num DESC');
    		
    while ($donnees = $req->fetch())
    {
    ?>
    	<tr style="font-style:bold;"><td><?php echo htmlspecialchars($donnees['Num']); ?></td><td><?php echo htmlspecialchars($donnees['Nom']); ?></td><td><?php echo htmlspecialchars($donnees['Prenom']); ?></td><td><?php echo htmlspecialchars($donnees['Stagiaire']); ?></td>
         
    	
    <?php
    } 
    ?>
    </table>
    1. J'ai un erreur sur ces lignes de code :

      while($row = mysql_fetch_array($rs)) {
      <tr style="font-style:bold;"><td><?php echo
      htmlspecialchars($row['nom']); ?></td><td><?php echo
      htmlspecialchars($row['prenom']); ?></td><td><?php echo
      htmlspecialchars($row['stagiaire']); ?></td><td><?php echo
      htmlspecialchars($row['sstraitant']); ?></td></tr>
      }

      L'erreur est : Parse error: syntax error, unexpected '<' sur la deuxième ligne du code ci-dessus.

      As-tu une explication ?

      Merci de ton retour.
    2. while($row = mysql_fetch_array($rs)) {
      ?>
      <tr style="font-style:bold;"><td><?php echo
      htmlspecialchars($row['nom']); ?></td><td><?php echo
      htmlspecialchars($row['prenom']); ?></td><td><?php echo
      htmlspecialchars($row['stagiaire']); ?></td><td><?php echo
      htmlspecialchars($row['sstraitant']); ?></td></tr>
      <?php
      } 
  2. Contributeur
    En PHP tu n'auras qu'à faire un loop sur les éléments de ton tableau pour les placer dans un les cellules correspondantes.

    http://php.net/manual/en/control-structures.foreach.php
    1. Ok merci je teste ça dans la semaine, et je vous tien au courant.

      Si quelqu'un à autre chose à proposer, allez-y ...
      1. Voici mon code complet :
        http://www.zimagez.com/zimage/code32.php

        Mais j'ai une erreur : Parse error: syntax error, unexpected $end.
        Sur la ligne 61, alors qu'il n'y en a pas.

        Quelqu'un pour m'aider ??

        PS: Merci maka54 c'était ça !
        1. A la ligne 46, faut rouvrir la balise php "<?php" deja
        2. Effectivement merci :)

          Maintenant, j'ai l'en tête de ma page, mais pas du tout le tableau, j'ai une erreur :
          Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given sur la ligne 40.

          Merci de vos retours aussi rapide.
      2. J'ai réussi à corriger ...

        Par contre maintenant j'aimerai avoir une en-tête à mon tableau, c'est à dire que j'aimerai donner un nom au colonnes, pour ne pas avoir que le contenu récupérer de ma base ... ?

        De plus dans mon code, il est censé affiché une image (ligne 16), pouvez-vous me dire pourquoi celle-ci n'est pas affichée ?

        Merci.
        1. Bonsoir keenan,
          Pour l'entête d'un tableau, il faut utiliser la balise "<th>" et "</th>"
          Donc:
          <table>
          <tr><th>Colonne1</th><th>..</th><th>..</th></tr>
          <tr><td>contenu</td><td>contenu</td><td>contenu</td></tr>
          ..
          <tr><td>contenu</td><td>contenu</td><td>contenu</td></tr>
          </table>
        2. D'accord je teste cela la semaine prochaine. Merci
        3. Quoi que :) Désolé je suis unpeu loosé sur l'explication ^^ On va dire que c'est parce que c'est la fin de la semaine.

          Tu pourrai me donner un exemple par rapport à mon code, comment l'intégrer dans ma boucle while :) Merci.
        4. Voila le code avec une boucle pour remplir le tableau:
          <table> 
          	<tr style="font-style:bold;"> 
          		<th>Colonne1</th> 
          		<th>Colonne2</th> 
          		... 
          		... 
          		<th>DernièreColonne</th> 
          	</tr> 
          	 while($row = mysql_fetch_array($rs)) 
          	 { 
          	 } 
          </table>
        5. Cela s'applique de la même manière à ce genre de code : ?
          while($row = mysql_fetch_array($rs)) {
          ?>
          <tr style="font-style:bold;"><td><?php echo
          htmlspecialchars($row['nom']); ?></td><td><?php echo
          htmlspecialchars($row['prenom']); ?></td><td><?php echo
          htmlspecialchars($row['stagiaire']); ?></td><td><?php echo
          htmlspecialchars($row['sstraitant']); ?></td><td><?php echo
          htmlspecialchars($row['respCO']); ?></td><td><?php echo
          htmlspecialchars($row['respCC']); ?></td><td><?php echo
          htmlspecialchars($row['datefin']); ?></td></tr><?php
          }
      3. Ce code fonctionner merci.

        J'aurai juste besoin d'une petite précision, comment puis-je faire pour faire correspondre les données que je récupère dans ma BDD à la bonne colonne créée ?

        Merci.
        1. "$row" contient tous les champs (que tu vas placer dans chaque colonne) d'un seul enregistrement (que tu vas placer dans une ligne de ton tableau. Ainsi:
          $row['nom'] contient la valeur du champ "Nom"
          $row['prenom'] contient la valeur du champ "prenom"
          $row['stagiaire'] contient la valeur du champ "stagiaire"
          $row['sstraitant'] contient la valeur du champ "sstraitant"
          $row['respCO'] contient la valeur du champ "respCO"
          $row['respCC'] contient la valeur du champ "respCC"
          $row['datefin'] contient la valeur du champ "datefin"
          Ces précisions te suffisent ?
          Sinon, soit plus précis, car c'est que je n'ai pas compris ta question.
          1. Effectivement je n'ai peut être pas été très précis.

            J'ai une partie de mon code qui permet d'afficher l'en-tête des colonnes (<th>...</th>), et une autre partie qui me permet d'afficher le contenu des champs que je récupère dans ma BDD.

            Ce que je voudrai, je vais donner un exemple ce sera surement plus explicite, c'est que le 'nom' que je récupère de la BDD, soit affiché dans la colonne "Nom", idem pour le prenom, la date ...

            Est-ce plus claire ?

            Merci.
          2. Pour moi, ce n'est pas plus claire .. j'en suis désolé.
            Mais je vais éclaircir ma dernière explication .. c'est peut-être de cela que tu veux parler .. on y va:

            Quand tu récupère ton enregistrement mysql_fetch_array($rs) et que tu fais une boucle, pour parcourrir tous les enregistrements while($row = mysql_fetch_array($rs)),
            A chaque tour (de boucle), tu as donc un enregistrement complet, contenant, "nom", "prenom", "stagiaire", "sstraitant", "respCO", "respCC" et "datefin".

            Admettons ton tableau, avec l'ordre des colonnes comme ceci:
            "datefin", "sstraitant", "stagiaire", "respCO", "respCC", "prenom", "nom".

            Alors, il faudra écrire dans ton code, dans cet ordre:
            <td><?php echo htmlspecialchars($row['datefin']); ?></td>
            <td><?php echo htmlspecialchars($row['sstraitant']); ></td>
            <td><?php echo htmlspecialchars($row['stagiaire']); ?></td>
            <td><?php echo htmlspecialchars($row['respCO']); ?></td>
            <td><?php echo htmlspecialchars($row['respCC']); ?></td>
            <td><?php echo htmlspecialchars($row['prenom']); ?></td>
            <td><?php echo htmlspecialchars($row['nom']); ?></td>
            

            En d'autres termes,
            <td><?php echo htmlspecialchars($row['CHAMPS']); ?></td>
            tu remplaces le mot CHAMPS par le nom du champs que tu veux afficher dans cette colonne.
            Est-ce cela que tu as demandé ?
          3. On va y arriver, je ne désespère pas ... :)

            Je ne suis pas sûr que cela réponde, en faite actuellement avec mon code, j'ai le tableau avec le nom de colonnes, puis en dessous toutes les lignes avec ce que je récupère de la base de données.

            Sauf que ce que je récupère de ma base ne set met pas au bonne endroit dans le tableau :

            Voici les lien suivant avec mon code et mon résultat, je pense que tu me comprendra mieux comme cela :
            http://www.zimagez.com/zimage/rsultat2.php
            http://www.zimagez.com/zimage/code33.php

            merci.
        2. Bonsoir keennan,
          - Je n'ai pas tout le code .. on va faire avec.
          - Dans l'affichage de ta page Web, il y a 13 colonnes, dont la colonne "nom" qui est repris 2 fois .. Pourquoi 2 fois la même valeur ?

          Donc, je pars du principe qu'il te faut 12 colonnes:
          Nom
          Prenom
          Stagiaire
          SSTraitant
          Resp.CO
          Resp.CC
          CUID
          Date de fin
          Mail Alerte Manager
          Mail Depart
          Mail suppression
          Valider

          Pour afficher les 12 entêtes de colonnes:
          <tr> 
           <th>Nom</th> 
           <th>Prenom</th> 
           <th>Stagiaire</th> 
           <th>SSTraitant</th> 
           <th>Resp.CO</th> 
           <th>Resp.CC</th> 
           <th>CUID</th> 
           <th>Date de fin</th> 
           <th>Mail Alerte Manager</th> 
           <th>Mail Depart</th> 
           <th>Mail suppression</th> 
           <th>Valider</th> 
          </tr>

          La requête doit être changée comme ceci (en espérant que les noms de champs sont bien encodés comme ceux-là):
          $strSQL = "SELECT nom, prenom, stagiaire, sstraitant, respCO, respCC, CUID, datefin, MailAlerteManager, MailDepart, Mailsuppression, Valider FROM newcollab WHERE ...";

          Et pour afficher les valeurs:
          Affichage des valeurs
          while($row = mysql_fetch_array($rs)) 
          { ?> 
           <tr style="font-style: bold;"> 
            <td> 
             <?php echo htmlspecialchars($row['nom']); ?> 
            </td> 
            <td> 
             <?php echo htmlspecialchars($row['Valeur']); ?> 
            </td> 
          <?php }?>
          Il faut remplacer le mot en gras "Valeur" par un des nom de champs que tu as besoin d'afficher.
          C'est tou.
          1. Le principe de la requête est d'annoncer la couleur de ce que tu veux voir afficher. Exemple:
            $strSQL = "SELECT Champ1, Champ14, Champ12, Champs203, Champs2, Champ... FROM NomDeLaTable WHERE Condition"

            A partir de là tu peux afficher tous les champs contenu dans ta requête et seulement ceux-là !
          2. Je vais revoir mon code demain, car il ressemble beaucoup à ce que tu me dit, je vais vérifier et je te tiens au courant. Car je ne suis pas sur que en faisant cela les données et les en-tête soient bien alignés.

            Des que j'ai essayé je te dit, merci de ton suivi et de ta sympathie.
          3. Bonjour Heliotte,

            voilà le résultat final de ce code :
            http://hpics.li/50aedef

            Maintenant tu devrai mieux comprendre ma question :
            Comment aligner les données récupérées avec l'en-tête de la colonne, histoire que ça fasse quelque chose de correcte quand même ... ?

            Merci.
          4. Cela veux dire que CA MARCHE ?
            Attention toutefois à la date dans le coin supérieur gauche qui n'est pas à jour ! .. On est en décembre !!
            Pense à mettre résolu, merci.
          5. Ca marche OUI ET NON.

            Comme tu peut le voir, ce n'est pas très esthétique ... Sait tu comment je peut faire pour aligner les données et avec le titre des colonnes ... ?

            Merci.
        3. salut,
          Par défaut th est centré et td est aligné à gauche , si tu faisait cette mise en forme avec du CSS

          tu rajoutes dans la partie <head></head> de ta page:

          <style type="text/css">
          td, th {
             text-align:center;
          }
          </style>


          vas voir ce site:
          https://openweb.eu.org/articles/tableaux_css
          1. Merci à tout les deux. Je vais tester ca devrait marche.

            Heliotte : Merci pour la date, mais c'est normal, c'est la date du jour -30 normalement qui est affiché.

            Je passe le sujet en résolu dès que ce problème de centrage est résolu...