A propos des tableaux dynamiques

Eléphant du PHP | 179 Messages

20 sept. 2005, 15:45

Bonjour,

Actuellement, lorsque je crée un tableau dynamique, je crée toujours une ligne "en dur" (celle qui comprend les titres) et je génère dynamiquement les autres lignes du tableau.

Admettons maintenant que je veuille générer un tableau dont certaines cellules sont vides. Est-il possible de ne générer que les cellules remplies?

Par exemple, soit une fiche sur un film.

Nom du film : ET
Réalisateur : S.Spielberg
Synopsis : C'est l'histoire d'un nain strate et le reste
Année : ?

Admettons que l'année n'est pas renseignée. Par conséquent, je ne veux pas que la ligne "Année" apparaisse à l'affichage.

Cela est-il possible? Cela relève-t-il du PHP ou du HTML?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

20 sept. 2005, 15:50

Tu peux le traiter en PHP en vérifiant avant la création de chaque ligne que les 4 paramètres ne sont pas vides et selon le résultat générer la ligne ou passer au tour suivant de ta boucle.

Mais tu pourrais aussi le faire en amont au niveau de ta requête SQL en ne récupérant QUE les éléments formant des lignes complètes sans valeurs nulles : de cette façon tu n'aurais plus à te préoccuper de cellules vides dans ton tableaux, toutes seraient obligatoirement remplies avec une valeur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

20 sept. 2005, 16:01

Tu peux le traiter en PHP en vérifiant avant la création de chaque ligne que les 4 paramètres ne sont pas vides et selon le résultat générer la ligne ou passer au tour suivant de ta boucle.
Donc si je prends cette possibilité, ça donnerait qq chose du type (ne pas faire attention à la ponctuation, je m'attache à la démarche pour le moment):
if (!$Annee)
    print // là je ne sais pas comment exprimer le "ne rien afficher"
else 
    print ('$Année')
Dans ce cas là, comment je génère la ligne titre de mon tableau (Année)?

Mais tu pourrais aussi le faire en amont au niveau de ta requête SQL en ne récupérant QUE les éléments formant des lignes complètes sans valeurs nulles : de cette façon tu n'aurais plus à te préoccuper de cellules vides dans ton tableaux, toutes seraient obligatoirement remplies avec une valeur.
Dans ce cas là, y a-t-il des fonctions spécifiques à connaître? Et même question: comment est-ce que je fais pour ma ligne "en dur"?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 sept. 2005, 16:11

C'est le rôle de PHP.
Il faut tester le contenu de l'élèment avant de l'afficher dans une cellule.
Dans ton cas, l'année vide ne doit pas apparaître : le code PHP suivant illustre ce cas de figure :
<?
//Exemple de contenu à afficher
$films = array(
                       array ("titre"=>"E.T.", "réalisateur"=>"S.Spielberg" , "année"=>""),
                       array ("titre"=>"Garfield", "réalisateur"=>"Peter Hewitt","année"=>"2004")
); //fin du tableau $films

//Fiches des films (film par film)
foreach ($films as $unFilm) {
      echo "<p><table border=1><Legend><Strong>Fiche de film</Strong>";
      //Ne pas afficher les élèments vides       
      if ($unFilm["titre"] != null && trim($unFilm["titre"]) != "")
                 echo "<tr><th>Titre :<td>".$unFilm["titre"];
      if ($unFilm["réalisateur"] != null && trim($unFilm["réalisateur"]) != "")
                 echo "<tr><th>Réalisateur :<td>".$unFilm["réalisateur"];
      if ($unFilm["année"] != null && trim($unFilm["année"]) != "")
                 echo "<tr><th>Année :<td>".$unFilm["année"];
      //Fin d'une fiche
     echo "</table>";
} //Au suivant!
?>
La fonction trim($variable) elimine les espaces inutiles (dans le cas où $variable ne contient que des espaces trim() retourne vide "") elle est utilisée ici pour s'assurer que les chaines contenant des espaces par mégarde sont conciérées vides (car un espace n'est pas du vide)

La structure foreach permet de boucler dans un tableau comme la boucle for.
Modifié en dernier par sadeq le 20 sept. 2005, 16:19, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

20 sept. 2005, 16:19

Illustration de mes explications précédentes : première méthode:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
    if(!empty($ligne['titre']) && !empty($ligne['realisateur']) && !empty($ligne['synopsis']) && !empty($ligne['annee']))
    {
?>
  <tr>
    <td><?php echo($ligne['titre']); ?></td>
    <td><?php echo($ligne['realisateur']); ?></td>
    <td><?php echo($ligne['synopsis']); ?></td>
    <td><?php echo($ligne['annee']); ?></td>
  </tr>
<?php       
    }
}
?>
</table>
Selconde méthode:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema".
       "WHERE titre <> ''".
       "AND realisateur <> '' ".
       "AND synopsis <> '' ".
       "AND annee <> '0000-00-00' ".
       "AND annee <> ''";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo($ligne['titre']); ?></td>
    <td><?php echo($ligne['realisateur']); ?></td>
    <td><?php echo($ligne['synopsis']); ?></td>
    <td><?php echo($ligne['annee']); ?></td>
  </tr>
<?php       
}
?>
</table>
Adapte les noms de table et de champs à ta propre base et tu obtiendras ce que tu cherches à faire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 sept. 2005, 16:26

Cyrano, je pense que Elisa ne veut afficher que les élèments non vides d'un même film.
Je remarque que tes programmes éliminent tous les champs quand au moins un seul est vide (tu utilise la Jonction ET dans les 2 méthodes)

Tu dis : A ET B ET C (élèments non vides) ? => si au moins C est fausse tout est faux et le film n'est pas traité même si A et B contiennent des données et ça c'est pas bon!

Il faut traiter l'affichage des élèment cas par cas => si A n'est pas vide alors l'afficher.

Elisa, quand un if (si) n'a pas d'action else (sinon) il faut inverser la condition pour ne garder que le cas si vrai:
Exemple:
L'écriture : if (A) { //rien } else {echo "Ô c'est pas A!";} c'est faut.
Il faut écrire : if (!A) { echo "Ô c'est pas A!";} en inversant la condition par ! (not)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

20 sept. 2005, 16:44

Alors n'affichons que les données existantes et une cellule vide là où les données sont abentes:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['realisateur']) ? $ligne['realisateur'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['synopsis']) ? $ligne['synopsis'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['annee']) ? $ligne['annee'] : "&nbsp;"); ?></td>
  </tr>
<?php       
}
?>
</table>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

20 sept. 2005, 16:52

<?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?>
Qu'est-ce que c'est?
"&nbsp;"
Comment définis-tu la variable $ligne?
Avec ce code la partie html disparaît-elle si la condition n'est pas remplie?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

20 sept. 2005, 18:02

La première formule:
<?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?>
Est strictement la même chose que:
<?php if(!empty($ligne['titre']){echo($ligne['titre']) } else { echo("&nbsp;") } ?>
"&nbsp;" = Non Breakable SPace = Espace insécable .

Ensuite, $ligne est définie dans le while et c'est un tableau associatif puisque j'utilise mysql_fetch_assoc, il aurait été indexé si j'avais utilisé mysql_fetch_row et l'un ou l'autre au choix si j'avais utilisé mysql_fetch_array.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

23 sept. 2005, 11:37

Alors n'affichons que les données existantes et une cellule vide là où les données sont abentes:
<?php
$sql = "SELECT titre, realisateur, synopsis, annee FROM t_cinema";
$requete = mysql_query($sql);
?>
<table>
  <tr>
    <th>Titre</th>
    <th>Réalisateur</th>
    <th>Synopsis</th>
    <th>Année</th>
  </tr>
<?php
while($ligne = mysql_fetch_assoc($requete))
{
?>
  <tr>
    <td><?php echo(!empty($ligne['titre']) ? $ligne['titre'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['realisateur']) ? $ligne['realisateur'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['synopsis']) ? $ligne['synopsis'] : "&nbsp;"); ?></td>
    <td><?php echo(!empty($ligne['annee']) ? $ligne['annee'] : "&nbsp;"); ?></td>
  </tr>
<?php       
}
?>
</table>
Si je comprends bien ton exemple, je garde la partie html en dur (les titres). Comment faire si je ne veux pas de la ligne si elle se présente ainsi :
<tr>
<th>Titre<th>
<td>ET l'extraterrestre</td>
<tr>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

23 sept. 2005, 16:26

Oups désolée, mais en relisant le post j'ai vu que Sadeq a répondu à ma question. :oops: [La fatigue...]

En revanche lorsqu'il définit "array", est-ce que je peux remplacer
array ("titre"=>"E.T.", "réalisateur"=>"S.Spielberg" , "année"=>""), 
par
array ("titre"=>"$titre", "réalisateur"=>"$realisateur" , "année"=>"$annee")
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Tho
Eléphant du PHP | 58 Messages

23 sept. 2005, 16:43

Oui et comme ce sont des variables, tu peux te passer des guillemets :
... "titre"=>$titre, ...

Eléphant du PHP | 179 Messages

23 sept. 2005, 16:45

Merci je vais tester tout ça... :)
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

28 sept. 2005, 14:36

Bonjour,

Je me suis finalement orientée vers la proposition de Sadeq, qui correspondait le mieux au résultat que je recherchais. En revanche, j'ai un souci: mon code HTML s'articule mal avec le PHP.
Par exemple, lorsque je fais ceci:
<?php 
if ($Presentation !=null && trim($Presentation)!="")
{
echo "<tr>
	<td style=text-align: justify; vertical-align: top; font-size: 11pt; font-weight: bold; font-family: Arial,sans-serif; color: ff9900;>
	Présentation :
	</td>
	<td style=text-align: justify;>
		<span style=font-size: 10pt; font-family: Arial,sans-serif;>
			".nl2br ($Presentation)."
		</span>
	</td>
</tr>";
}
?>
Dans ce cas, il n'y a pas de " " après le HTML (ex. td style="...") mais il n'interprète pas les indications html. Si, en revanche je les remets, il m'affiche ceci:
Parse error: parse error, expecting `','' or `';'' in c:\program files\easyphp1-8\www\sinbad\user\aff_groupes.php on line 72
Est-ce que vous auriez déjà rencontré un problème similaire ou bien auriez-vous une explication à la cause de ce phénomène? :-k
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Tho
Eléphant du PHP | 58 Messages

28 sept. 2005, 14:46

Je te propose une présentation de ce type :
<?php
if (trim($Presentation) != "")
{ 
?>
<tr>
  <td style="text-align: justify; vertical-align: top; font-size: 11pt; font-weight: bold; font-family: Arial,sans-serif; color: ff9900;">
    Présentation :
  </td>
  <td style="text-align: justify;">
    <span style="font-size: 10pt; font-family: Arial,sans-serif;">
      <?php echo nl2br($Presentation); ?>
    </span>
  </td>
</tr>
<?php
}
?>