HELP sur for() et While()

marc96
Invité n'ayant pas de compte PHPfrance

21 févr. 2011, 01:22

Bonjour,

Après moultes essais, je n'arrive p as à afficher ce que je veux;
Je me suis fait une base de donnée des films que je vois avec titre/Réalisateur/Année
J'aimerais afficher une filmo comme ceci :

2011

- titre du film 1
- titre du film 2
-...

2010

- titre du film 1
- titre du film 2
-...

etc

Voici mon code qui pose problème d'affichage :


for ($year=2050; $year>1900; $year--)
{$demande = "SELECT titre,realisateur,annee FROM films WHERE annee='$year' ORDER BY titre ASC";
$i = 0;
$sth = $db->query($demande);
if (DB::isError($sth)) {
die ($sth->getMessage());
}else{
while($rangee = $sth->fetchRow(DB_FETCHMODE_ASSOC))
{
$titre[$i] = $rangee['titre'];
$realisateur[$i] = $rangee['realisateur'];
$annee[$i] = $rangee['annee'];
$i++;
}
}
}


Merci de votre aide !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2011, 01:37

salut,

ou alors tu fait bien sql :)

"SELECT titre,realisateur,annee FROM films group by annee ORDER BY titre ASC

et pour l'affichage une variable "tampon" qui garde l'année traité et quand ça change tu affiche l'année.

par exemple
<?php
$annee='';
while ( ....) {
if ($annee !== $rangee['annee']) {
echo $rangee['annee'];
$annee = $rangee['annee'];
}
//affichage du reste normalement
}
?>

@+
Il en faut peu pour être heureux ......

marc96
Invité n'ayant pas de compte PHPfrance

21 févr. 2011, 02:04

Bonjour,
Merci de ton aide, mais je ne vois pas trop ce que tu me dis.

Et le code "FROM films group by annee" est pas une norme reconnu visiblement... il me met "DB Error: syntax error"

marc96
Invité n'ayant pas de compte PHPfrance

21 févr. 2011, 02:22

Je précise que pour l'affichage, j'appelle un TPL (templates), sur lequel j'inscris ceci :

{section name=j loop=$annee} {$annee[j]} <br> {$titre[j]} {/section}

marc96
Invité n'ayant pas de compte PHPfrance

21 févr. 2011, 02:24

Au résultat, j'ai un affichage correcte de certaines années (en double) et d'un seul titre par année :

(....)

2006

Titre

2009

Titre

2009

Titre

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2011, 02:47

hum wé group by pas normalisé tu fait erreur http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L1

par contre à la relecture group by n'est pas approprié, par contre un order by annee,titre serais plus indiqué.

le plus simple etant de tester la requete directement sur le SGBD et ensuite de l'intégrer dans ton code.

le coup de la césure est à faire quelque soit la chose utilisée template ou pas il va donc te falloir refaire ce que j'ai mis au dessus dans ton template et non dans le code du while puisse que ce n'est pas lui qui affiche.

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

21 févr. 2011, 09:51

Bonjour,

Il faut gérer une rupture sur l'année.

De manière schématique :
$annee = 0
while ($data=mysql_fetch(...))
{
   if ($annee<>$data['annee']) rupture($annee,$data);
   $année = $data['annee'];
   afficher_film(); 
 }
 if ($annee <> 0) echo '</table>';

function rupture($annee,$data)
{
   if ($annee <> 0) echo '</table>';
   echo $data['annee'];
   echo '<table>';
}

function  afficher_film($data);
{
   echo '<tr><td>.........</td></tr>';
} 

ViPHP
ViPHP | 5462 Messages

21 févr. 2011, 10:50


marc96
Invité n'ayant pas de compte PHPfrance

22 févr. 2011, 15:48

Merci de votre aide,

mais ma page fonctionnant avec un TPL appellant les variables définies dans un fichier PHP, je ne peux pas fonctionner avec des "echo".

J'ai donc ma page PHP avec le script mentionné ci-dessus.
Puis mon templates avec le script mentionné ci-dessus;
L'affichage également mentionné ci-dessus ne me convient pas car il ne regroupe pas les années, et ne remonte qu'un titre à la fois.

Quelle erreur y a-t-il dans mes scripts actuels ?

Merci,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 févr. 2011, 16:02

comme indiqué par tous les post : pas de césure sur l'année au niveau de l'affichage tu n'a pas le choix ton template affiche année et donnée associée !

si tu ne peut modifier le template dans ce sens alors ce que tu souhaite n'est pas réalisable car cela ce fait à l'affichage

@+
Il en faut peu pour être heureux ......