PHP-Astux.info

DarkVador à Tux Skywalker : "Je suis ton PEAR ..."

Script : Créer un compteur de téléchargements en MySQL avec PHP

Sommaire

  1. A quoi sert un compteur de téléchargements ?
  2. Pourquoi MySQL et PHP ?
  3. Code source du compteur de téléchargements
  4. Mise en ligne et comptage
  5. Quelques fonctionnalités avancées

A quoi sert un compteur de téléchargements ?

Ce compteur est un script simple qui va vous permettre de savoir combien de fois a été téléchargé un fichier. Cela sert par exemple pour voir l'impact d'une page (ou d'un outil) sur un site, mais cela peut aussi servir à compter combien de gens ont ouvert votre newsletter ... En réalité, son principe de fonctionnement est très simple. Nous allons créer une page qui aura 2 rôles :

  1. A l'appel d'un fichier, incrémenter le compteur (c.à.d. ajouter "+1" dans la base de données)
  2. Bien entendu, délivrer le fichier au visiteur

Pour réaliser ce compteur, nous aurons besoin de 2 langages puisque tout le gros de l'action se déroulera côté serveur : PHP et MySQL.

Pourquoi MySQL et PHP ?

La base de données, base MySQL, est située sur le serveur. Le visiteur sur votre site ne la verra pas. Il n'y a pas accès (en principe ^^) et le seul moyen d'incrémenter les données de cette base est bien de passer par un langage qui sait interroger et manipuler des données : un langage serveur. Certes le choix peut être plutôt vaste, le PHP est totalement arbitraire, d'abord parce que c'est un vieil ami et ensuite parce que la plupart des hébergeurs le proposent.

Ceci dit, si votre serveur n'est pas sous Apache mais Microsoft, le principe reste le même entre ASP et SQL Server par exemple. Seule la formulation du langage change.

Bref, afin de centraliser les données (pour que tous les visiteurs manipulent bien les mêmes informations, et non chacun les leur sur leur ordinateur), il faut les centraliser, d'où l'intérêt indéniable de les mettre sur le serveur qui abrite le site.

Code source du compteur de téléchargements en PHP MySQL

La table dans la base MySQL

Pour ce faire, nous allons créer plusieurs éléments. Tout d'abord, la base de données. Je vous propose ici une structure générique, truffée de commentaires, si vous souhaitez y ajouter d'autres informations, vous pouvez tout à fait (le chemin du fichier par exemple)

-- Création de la table : 'downloads_files'

CREATE TABLE downloads_files (
  filename   VARCHAR(255) NOT NULL, -- je suppose que chaque fichier est unique ;o)
  downloaded INT(5)       NOT NULL DEFAULT 0, -- par défaut, téléchargé 0 fois

  PRIMARY KEY(filename)
) Type = MyISAM;

La structure de cette table est assez simple, je supposerai dans ce tuto que tous les fichiers sont dans un même dous dossier. Sinon, il suffit de rajouter un champ dans la table ci-dessus, par exemple filedir VARCHAR(255) NOT NULL

Le code source PHP de download.php

download.php sera notre unique fichier qui centralisera tous les téléchargements. En réalité, c'est via un paramètre qu'on appellera le fichier, download.php se chargeant alors d'incrémenter le compteur et de délivrer le fichier au visiteur.

Voici son code source :

<?php
	// Mini config
	$MYSQL_HOST = 'localhost';
	$MYSQL_DB = 'ma_base';
	$MYSQL_USR = 'utilisateur';
	$MYSQL_PWD = 'palmier';
	$filesdir = '../documents/fichiers/'; // le chemin relatif où sont stockés les fichiers (si pas mis dans la base)

	// Connexion MySQL
	$conn = mysql_connect($MYSQL_HOST, $MYSQL_USR, $MYSQL_PWD) or die(mysql_error());
	mysql_select_db($MYSQL_DB, $conn) or die(mysql_error());


	// Récupération du fichier passé en paramètre
	$filename = (isset($_GET['f'])) ? trim(sprintf("%s", $_GET['f'])) : '';

	if ($filename != '') // non vide
	{
		// IMPORTANT : avant quoi que ce soit, on vérifie que le fichier existe bien
		if ((file_exists($filesdir . $filename)) && (is_file($filesdir . $filename)))
		{
			// Le fichier existe bien : on va incrémenter son compteur de téléchargements
			$req_augmenterdownload = "UPDATE downloads_files
						SET
							downloaded = (downloaded+1)
						WHERE
							filename='".$filename."';";

			// maintenant on exécute la requête
			mysql_query($req_augmenterdownload) or die($req_augmenterdownload.'<br />'.mysql_error());

			// requête effectuée : on envoie le fichier
			header("Location: ".$filesdir . $filename);
			exit();
		};
	};
?>

Dans ce code, il faudra prendre soin de retirer le "or die($...'<br />'.mysql_error())" bien entendu : par sécurité, il est préférable de ne pas afficher les erreurs MySQL ... Je l'ai laissé ici le temps des tests, juste pour que vous vous aperceviez de l'erreur (s'il y en a une).

Mise en ligne et comptage

Et maintenant, le code sur le site Web : ce code peut être mis n'importe où, dans de l'HTML, dans du Javascript, dans du PHP, peu importe : le tout est d'appeler download.php?f=VOTRE_FICHIER, par exemple :

<h2>Zone téléchargements</h2>

	<h3>NewsletTux 2</h3>
	<p><a href="download.php?f=newslettux2.zip">Télécharger NewsletTux 2</a></p>

	<h3>Mise à jour</h3>
	<p><a href="download.php?f=newslettux2-upgrade.zip">Télécharger la mise à jour vers NewsletTux 2</a></p>

Pour ces 2 fichiers, il faudra bien entendu créer dans la table une entrée "newslettux2.zip" et une entrée "newslettux2-upgrade.zip" ...

On peut imaginer plein d'améliorations, comme par exemple la date du dernier téléchargement, un comptage par mois, semaines, etc., toutes ces idées sont plus ou moins faciles à réaliser ...

Quelques fonctionnalités avancées

Ici, nous allons mettre un champ "dernier téléchargement" ainsi qu'afficher la date de dernier téléchargement sur le site... De plus, nous afficherons le nombre total de téléchargements pour ce fichier.

Pour ce faire, nous allons réaliser une petite fonction PHP, laquelle permettra de rapatrier facilement ces données. La page affichant le lien download.php?VOTRE_FICHIER doit, pour cette dernière partie, obligatoirement comporter l'extension .php

Tout en haut de cette page, mettez ce code :

<?php
	// Mini config
	$MYSQL_HOST = 'localhost';
	$MYSQL_DB = 'ma_base';
	$MYSQL_USR = 'utilisateur';
	$MYSQL_PWD = 'palmier';

	// Connexion MySQL
	$conn = mysql_connect($MYSQL_HOST, $MYSQL_USR, $MYSQL_PWD) or die(mysql_error());
	mysql_select_db($MYSQL_DB, $conn) or die(mysql_error());

	
	function AfficheDetailsTelechargements($file, $details_type)
	{
		$req_FileDetails = "SELECT
						{CHAMP}
					FROM
						downloads_files
					WHERE
						filename='".$file."';";


		// Lecture du nombre de téléchargements ou de la date de dernier téléchargement pour un fichier
		$req_FileDetails = ($details_type == 'total') ?
			str_replace('{CHAMP}', 'downloaded', $req_FileDetails) :
			str_replace('{CHAMP}', 'last_download', $req_FileDetails);



		// On effectue la requête et on retourne le résultat
		$FileDetails = mysql_query($req_FileDetails) or die($req_FileDetails.'<br />'.mysql_error());

		if (mysql_num_rows($FileDetails) != 1) // aucun fichier portant ce nom là
		{
			return 0;
		}
		else // il y a bien un fichier à ce nom là
		{
			$rs = mysql_fetch_array($FileDetails);

			return ($details_type == 'total') ? $rs['downloaded'] : date("d/m/Y H:i:s",$rs['last_download']);
		};
	};
?>

La table MySQL correspondante comporte un champ de plus, pour stocker la date de dernier téléchargement :

-- Création de la table : 'downloads_files'

CREATE TABLE downloads_files (
  filename      VARCHAR(255) NOT NULL, -- je suppose que chaque fichier est unique ;o)
  downloaded    INT(5)       NOT NULL DEFAULT 0, -- par défaut, téléchargé 0 fois
  last_download INT(5)       NOT NULL DEFAULT 0, -- par défaut, téléchargé 0 fois

  PRIMARY KEY(filename)
) Type = MyISAM;

Dans download.php (cf. code plus haut), remplacer la requête d'incrémentation par :

			$req_augmenterdownload = "UPDATE downloads_files
						SET
							downloaded = (downloaded+1),
							last_download = '".time()."'
						WHERE
							filename='".$filename."';";

Voilà, notre fonction et les stats sont prêtes. Dans cette même page, on peut donc afficher quelques statistiques sur les liens :

<h2>Zone téléchargements</h2>

	<h3>NewsletTux 2</h3>
	<p><a href="download.php?f=newslettux2.zip">Télécharger NewsletTux 2</a></p>
	<p><?php echo AfficheDetailsTelechargements('newslettux2.zip', 'total'); ?> téléchargements au total.<br />
		Dernier téléchargement le : <?php echo AfficheDetailsTelechargements('newslettux2.zip', 'date'); ?></p>

	<h3>Mise à jour</h3>
	<p><a href="download.php?f=newslettux2-upgrade.zip">Télécharger la mise à jour vers NewsletTux 2</a></p>
	<p><?php echo AfficheDetailsTelechargements('newslettux2-upgrade.zip', 'total'); ?> téléchargements au total.<br />
		Dernier téléchargement le : <?php echo AfficheDetailsTelechargements('newslettux2-upgrade.zip', 'date'); ?></p>