Alors, en détails, je commente (copier/coller ce texte dans un logiciel de coloriage comme Notepad++ facilitera nettement la lecture) :
<?php
$retour = mysql_query(´SELECT * FROM news ORDER BY id DESC LIMIT 0, 5´);
/* comme ça a déjà été dit, $retour est donc une "ressource" mysql, inutilisable en l´état. D´où l´intérêt d´utiliser la fonction mysql_fetch_array, qui va transformer une "ligne" de la ressource en un tableau (array).
Ici, on appelle "$donnees" ce tableau, provenant de la ligne de la ressource "$retour" */
while ($donnees = mysql_fetch_array($retour))
/* ce qui signifie donc : tant que l´on peut prendre une ligne de la ressource "$retour" pour la ranger dans l´array "$donnees", alors on entre dans la boucle. Quand on est arrivé au bout de la ressource, on ne peut plus en faire un tableau, donc on n´entre plus dans la boucle while */
{
?>
<div class="news">
<h3>
<?php echo $donnees[´titre´]; ?>
/* on affiche ce qui a été récupéré dans "$donnees", en particulier le champ `titre` qui se trouvait dans la base de données (ou plutôt : dans la table) */
<em>le <?php echo date(´d/m/Y à H\hi´, $donnees[´timestamp´]); ?> </em>
/* on fait pareil ici avec le champ `timestamp` */
</h3>
<p>
<?php
// On enlève les antislash
$contenu = nl2br(stripslashes($donnees[´contenu´]));
/* stripslashes() va retirer les backslashes qui ont été ajoutés par protection au contenu du champ appelé `contenu`, et nl2br transforme les retours à la ligne en balises <br />, pour que le texte s´affiche correctement dans le echo qui suit */
echo $contenu;
?>
</p>
</div>
<?php
} // Fin de la boucle des news
?>
Je ne vois pas qu´ajouter...si tu as des questions plus précises, tu le dis 