[PHP/MySQL] Compteur de downloads

Compteur de downloads [PHP/MySQL] - PHP - Programmation

Marsh Posté le 27-05-2008 à 18:35:00    

Bonjour à tous !
 
J'ai un petit probème dans un compteur de downloads que j'ai conçu.
 
<code type="php">
if(isset($_GET['download']))
{
 // Si le visiteur est connecté
 if (isset($_SESSION['logged']) AND $_SESSION['logged'] == true))
 {
  $id_medias = $_GET['download'];
  $retour = mysql_query('SELECT * FROM medias WHERE medias_id='.$id_medias);
   
  $donnees = mysql_fetch_array($retour);  
  $lien = $donnees['medias_lien'];
 
mysql_query('UPDATE medias SET medias_counter=medias_counter+1 WHERE medias_id ='.$id_medias);
   
  $dl = '<head><meta http-equiv="refresh" content="3; url='.$lien.'" /></head>';
  $dl .= '<p class="centrer">Le téléchargement va commencer dans 3 secondes...</p>';
  $dl .= '<p class="centrer">Si le téléchargement ne se lance pas cliquez <a target="_BLANK" href="'.$lien.'" >ici</a></p><br />';  
  return $dl;
 }
 else
 {
 $dl = '<head><meta http-equiv="refresh" content="3; url=../user/index.php?a=home" /></head>';
 $dl .= '<p class="centrer">Vous devez être connecté pour pouvoir télécharger un fichier.</p>';  
 return $dl;
 }
}
</code>
 
Pour expliquer un peu :
J'envoie a cette fonction une variable <gras>download</gras> transmise par <gras>GET</gras> qui contient l'id du fichier à télécharger.
Si le membre est connecté, je recupère les informations du fichier en question.
J'incrémente dans la BDD le champs medias_counter.
Et je renvoie via la variable <gras>$dl</gras> du texte et aussi une redirection vers le fichier.
 
Mon seul problème c'est que le compteur est incrémenté 2 fois.
La premiere fois à l'affichage de $dl, et une nouvelle fois à la redirection. Mais je ne sais pas pourquoi.  
 
Si quelqu'un aurait une idée du pourquoi du comment ? ou alors un autre algo pour faire mon compteur, sa serait sympa !
Merci :)
 
Mon probème


Message édité par kazzuuu le 27-05-2008 à 20:41:36
Reply

Marsh Posté le 27-05-2008 à 18:35:00   

Reply

Marsh Posté le 27-05-2008 à 19:37:43    

oo

Reply

Marsh Posté le 27-05-2008 à 20:34:00    

Au delà du fait que ce code est loin d'être parfait (mélange de tout, pas de test, sql injection, redirection par meta refresh, ...), quel est le code en question qui incrémente le compteur :??:
 
Comment est structuré l'arborescence et par curiosité qu'est ce que ça donne si je tape le lien directement :??:

Reply

Marsh Posté le 27-05-2008 à 20:43:45    

J'ai up mon premier message, j'avais mal copié.
 
Mélange de tout c'est à dire ?
 
Qu'est ce que je peux faire sur les SQL injection la ?
 
Comment on peut redirigé autrement ?

Reply

Marsh Posté le 28-05-2008 à 06:27:47    

Ca répond pas à toutes les interrogations.
 
Déjà tu incrémentes quoi qu'il arrive donc si redirection pour login  aussi.
 
Mélange de tout : html, php, redirection de fonctionnement par tag meta
 
Il faut filtrer les données qui viennent de l'utilisateur, au moins vérifier le type que tu attends, avoir une valeur par défaut, agir en fonction. Et pour limiter la casse soir requête préparée si ça se justifie ou à défaut échapper la chaine (mysql?_real_escape_sting)

Reply

Marsh Posté le 28-05-2008 à 13:19:15    

et pour rafraichir une page on utilise <?php header('Location:http://www.monsite.com'); ?>


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 28-05-2008 à 17:21:35    

mais avec header je peux pas retourner du texte.

Reply

Marsh Posté le 28-05-2008 à 17:22:54    

avec htmlentities(addslashes($_POST['var'])) c'est utile de le mettre ou non ?
 
Ou alors faut que j'utilise mysql_real_escape_sting() ?

Reply

Marsh Posté le 28-05-2008 à 23:28:33    

Je vote pour mysql_real_escape_string


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 29-05-2008 à 05:48:28    

retourner du texte avec header, pourquoi faire :??:

Reply

Marsh Posté le 29-05-2008 à 05:48:28   

Reply

Marsh Posté le 29-05-2008 à 09:40:46    

Si ton compteur ne se base que sur un unique champ, le moyen le plus simple est de faire, dans la page initiale, un lien comme suit :
<a href="download.php?file=XXX">Télécharger</a> (en supposant XXX comme étant l'ID du fichier)
 
la page download.php se compose comme suit :
 

Code :
  1. <?php
  2. $file = (isset($_GET['file'])) ? abs(intval($_GET['file'])) : 0;
  3. if ($file != 0)
  4. {
  5.  $req_fileURL = "SELECT medias_lien FROM medias WHERE medias_id='".$id_medias."';";
  6.  $fileURL = mysql_query($req_fileURL) or die(mysql_error());
  7.  if (mysql_num_rows($fileURL) == 1)
  8.  {
  9.   $thisfile = mysql_fetch_array($fileURL);
  10.   // Incrémentation du compteur
  11.   $req_update_ctr = "UPDATE medias SET medias_counter=(medias_counter+1) WHERE medias_id ='".$id_medias."';";
  12.   mysql_query($req_update_ctr) or die(mysql_error());
  13.   // et maintenant on livre le fichier
  14.   header("Location: http://www.ton_site.tld/".$thisfile['media_lien']);
  15.  };
  16. };
  17. ?>


 
Je n'ai volontairement pas mis la session, parce qu'elle ne protège rien du tout en réalité : vu que ton URL apparaissait en clair dans le code source, n'importe qui peut la récupérer.
Alors oui c'est vrai que j'ai pas mis de texte "vous allez être redirigé dans 2 sec", mais perso ça m'horripile.
 
Tu prendras soin également d'enlever les die(mysql_error()) sur ton serveur de prod, bien entendu : je les ai mis là pour les tests, mais en prod, ça se masque et ça se traite autrement :)


Message édité par NewsletTux le 29-05-2008 à 09:41:30

---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed