Script force download

Eléphant du PHP | 142 Messages

07 juil. 2011, 11:55

Bonjour,

Je suis débutant en PHP, et l'on m'a confié une tâche plutôt fastidieuse. Sur le site de mon entreprise, un script permet de faire du force download. Ce script fonctionne bien, à une exception près :
Depuis que l'on est passé sur un hébergement mutualisé chez OVH, lorsque l'on insère une donnée dans la base MySQL, le résultat est dupliqué, voire triplé, mais à d'autres moments non ! En gros, c'est aléatoire... Peut-être est-ce le script qui n'est pas optimisé ? Je sais en effet qu'il existe différents scripts pour faire du force download... Merci de votre aide :)
<?php 
session_start(); 

include ('../../Fichier_connect/x.php');

if (!empty($_SESSION['Login'])&&!empty($_SESSION['MDP']))
{
$fichier = 'monfichier';
$chemin = '../../Telechargement/V4.3/' . $fichier;


$login = $_SESSION['Login'];
$password = $_SESSION['MDP'];
$SQL= "(Select RaisonSociale From login Where Login='".$login."' and MDP ='".sha1($password)."')";
$req = mysql_query($SQL) or die('Erreur SQL !<br>'.$SQL.'<br>'.mysql_error());
$data = mysql_fetch_array($req);

	// Récupération du fichier passé en paramètre

	if ($chemin != '') // non vide
	{
		// IMPORTANT : avant quoi que ce soit, on vérifie que le fichier existe bien
		if (file_exists($chemin))
		{
			// Le fichier existe bien : on va incrémenter son compteur de téléchargements
			$req_augmenterdownload = "UPDATE downloads_files
						SET
							downloaded = (downloaded+1),
							last_download = '".time()."',
							last_user = '".$data['RaisonSociale']."'
						WHERE
							filename='".$chemin."';";
			mysql_query($req_augmenterdownload) or die($req_augmenterdownload.'<br />'.mysql_error());
			//Insertion qui télécharge
			$req_insert = "INSERT INTO suivi_telechargement (RAISONSOCIALE, FICHIER, DATE) VALUES ('".$data['RaisonSociale'] ."','".$chemin."','".time()."')";
			mysql_query($req_insert) or die($req_insert.'<br />'.mysql_error());

			// requête effectuée : on envoie le fichier
			$f=fopen($chemin,"rb");
			$file=fread($f,filesize($chemin));
			fclose($f);
			header("Content-disposition: attachment; filename=".$fichier);
			header("Content-type:application/octet-stream");
			header('Content-Length: '. filesize($chemin));
			header('Content-Transfer-Encoding: binary');
			header('Pragma: no-cache');
			header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
            
			echo($file);
			exit();
		};
	};
}
else
{
 echo "<script>alert(\"Vous devez vous connecter pour télécharger\")</script>"; 
 echo '<META HTTP-EQUIV="Refresh" CONTENT="3;URL= http://www.monsite.com"> '; 
};


function detect_browser($var)
{
	if(eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})", $var)) 
	{
		$c = "ie"; 
	}else{
		$c = "nn"; 
	}
	return $c;
}
?>

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

08 juil. 2011, 00:09

salut,

qu'est ce qui est inséré en double ?
est ce vraiment lors de l'utilisation de ce script ?

il y a update et insert, est ce vraiment l'insertion ?

a priori le script est "correct" bien qu'il puisse être modernisé !


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

Eléphant du PHP | 142 Messages

08 juil. 2011, 10:41

Bonjour,

Une fois que le fichier est téléchargé, cela est visible dans la base MySQL, mais normalement sur une seule ligne. Or, là, on voit deux ou trois fois la même info, alors qu'il faudrait qu'elle ne s'affiche qu'une seule fois...

Je suppose en effet que c'est à cause de ce script, mais après tout, rien n'est réellement sûr... Comme dit dans mon précédent message, c'est depuis qu'on est passé chez OVH. Et à ma connaissance, c'est le seul script qui gère le force download, donc... C'est lui le coupable !

Ce n'est pas un problème bien grave, mais ça aurait été plus propre de ne pas avoir de résultats décuplés dans la base.
Merci de t'être penché sur mon problème moogli :wink:

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

08 juil. 2011, 11:30

est ce que ce ne serait pas dû a un rechargement de la page ?

le script de lui même ne fait pas plusieurs insertion.

il faut debugger, afficher les infos une a une (du pas a pas ;) ) tout au long du script afin d'être certain du cheminement de celui ci et voir où cela peux mettre le brin ;)


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

Eléphant du PHP | 142 Messages

08 juil. 2011, 18:34

Je ne sais pas, je sèche... Je vais, pour le moment, laisser ce problème de côté. Merci de ton aide :P

devlop78
Invité n'ayant pas de compte PHPfrance

09 juil. 2011, 18:31

Regarde si ta page n'est pas appelé plusieurs fois par le même client. Fais un log pour cela.

En plus, mais ça ne doit pas être un substitut, il manque apparemment de controle côté serveur. Tu pourrais faire un UNIQUE (RAISONSOCIALE, FICHIER, DATE) sans les secondes pour DATE par exemple, et ouvrir une transaction avec la requête juste avant : comme ça, si l'une des deux échoue, les deux seront annulées, ce qui évite que "downloaded = (downloaded+1)" s'exécute alors que ce nombre serait totalement incohérent avec l'autre table.