Si vous avez une base de données relativement conséquente, vous saurez à quel point il peut être long de réaliser un script pour afficher des statistiques. Si en plus vous souhaitez afficher différents critères, vous en aurez pour une soirée de code rébarbante.

La solution passe par la création, dès le début, de fonctions polyvalentes et puissantes.
Dans ce billet, nous parlerons déjà de la représentation de données sous forme textuelle (liste et tableaux).

Le but du système sera de pouvoir utiliser un simple snippet pour afficher un maximum de données : notre fonction prendra donc en paramètre une requête SQL, et la chaine selon laquelle la requête doit être formatée :

function StatIts($SQL,$Code)

Cela impliquera bien entendu de respecter une certaine convention pour la variable $Code ! Pour cet article, nous supposerons que nous souhaitons utiliser la syntaxe suivante :

StatIts('SELECT Auteur,COUNT(*) AS Somme
FROM ...
LEFT JOIN ... ON ...
GROUP BY ...
ORDER BY COUNT(*) DESC
LIMIT 12',
'$Auteur : $Somme articles');

La requête en elle même n'a pas beaucoup d'importance (elle vient de cette page), en revanche notez que dans ce cas les $ ne sont pas interprétés (il s'agit d'une chaine entre apostrophes) : c'est à nous de faire les remplacements quand le besoin s'en fait sentir.

La première étape va bien entendu être d'exécuter la requête ; nous allons supposer qu'elle provient d'une source de confiance et ne contient pas de code malicieux. Ensuite, nous allons placer tous les résultats dans un tableau PHP, et non dans la structure SQL classique trop difficilement utilisable (les mysql_fetch_*).
Dernière subtilité, il va falloir remplacer tous les $QuelqueChose par leurs équivalents dans le tableau !

Un coup d'œil dans la doc : str_replace accepte les array en argument pour le search et le replace (search[0] est remplacé par replace[0], search[1] par replace[1]...), nous allons donc créer deux tableaux : l'un avec les clés SQL (Auteur et Somme dans ce cas), l'autre avec les valeurs. Sauf qu'en fait, on peut simplifier cela en utilisant un seul tableau dont les clés seront les clés SQL, et les valeurs... les valeurs (ohhh !). Autrement dit, un tableau du type array("Auteur"=>"Neamar","Somme"=>"15"), dont on récupérera clés et valeurs en temps voulu avec les fonctions array_keys() et array_values().

Dernière nuance : nos clés doivent être précédées d'un dollar pour être remplacées, on va donc utiliser array_map qui permet d'appliquer une fonction à tous les éléments d'un tableau.
Dans notre cas, une fonction très simple :

function Dollar($Texte)
{
	return '$' . $Texte;
}

Et voilà, tout est décortiqué ! Il ne reste plus qu'à mettre tout cela à plat :

function StatIts($SQL,$Code)
{
	$Ds=mysql_query($SQL);
	$Items=array();
	while($D=mysql_fetch_assoc($Ds))
		$Items[]=str_replace(array_map("Dollar",array_keys($D)),array_values($D),$Code) . ' ;';
	afficheListe($Items,'ol',3);
}

Bien entendu, vous êtes libre d'utiliser n'importe quelle fonction pour afficher vos résultats ; au pire une simple fonction fera l'affaire :

function afficheListe($Items)
{
	echo "
    \n"; foreach($Items as $Item) echo '
  1. ' . $Item . '
  2. ' . "\n"; echo "
\n"; }

Et voilà, libre à vous de réutiliser cette fonction autant de fois que vous le voulez...

En bonus : la fonction StatIt (ne pas confondre avec StatIts) pour afficher un unique résultat :

function StatIt($SQL,$Code)
{
	$D=mysql_fetch_assoc(mysql_query($SQL));
	echo str_replace(array_map("Dollar",array_keys($D)),array_values($D),$Code);
}

Le code dans son intégralité :

function StatIts($SQL,$Code)
{
	$Ds=mysql_query($SQL);
	$Items=array();
	while($D=mysql_fetch_assoc($Ds))
		$Items[]=str_replace(array_map("Dollar",array_keys($D)),array_values($D),$Code) . ' ;';
	afficheListeColonnes($Items,'ol',3);
}
function StatIt($SQL,$Code)
{
	$D=mysql_fetch_assoc(mysql_query($SQL));
	echo str_replace(array_map("Dollar",array_keys($D)),array_values($D),$Code);
}
function Dollar($Texte)
{
	return '$' . $Texte;
}