Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Vous fachez pas, je disais ça juste comme ça... ;-)

C'est clair qu'il choisit le solution qui l'arrange (et surtout il n'oublie pas de revenir nous dire si ça lui convient... hum...) !

Posté(e) (modifié)
<?
$error = false;

// on teste l'existance de id et sa validite (est ce bien un nombre)
if (!isset($_GET["id"]) || !is_numeric($_GET["id"]))
    $error=true;

// on verifie que id pointe effectivement vers une entree de notre table
if ($error || "SELECT count(*) FROM dl WHERE id=$_GET['id']" != 1)
    $error=true;

if ($error)
{?>
    <html>
    <body>
    Une erreur s'est produite
    </body>
    </html>
<?}
else
{
    // on incremente le compteur
    "UPDATE dl SET click=click+1 WHERE id=$_GET['id']"

    // on recupere le nom du fichier a envoyer
    $file = "SELECT url FROM dl WHERE id=$_GET['id']"

    // on envoie maintenant le fichier !
    ob_clean();
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("content-type: application/octet-stream");
    header("Content-Length: ".filesize($file);
    header("Content-Disposition: attachment; filename=".str_replace(" " , "_" , basename($file)));
    flush();
    readfile($file);
}
?>

 

Salut !

 

J'ai un peu épurer le code de bill-bob (pardonne moi), ça donne

 

    $res = mysql_query("SELECT url FROM dl WHERE id=".$_GET['id']);
    if($file = mysql_fetch_array($res)) {
           mysql_query("UPDATE dl SET click=click+1 WHERE id=$_GET['id']");
           echo '<meta http-equiv="refresh" content="5; url="'.$file[url].'">';
    }

 

J'ai donc supprimé la requête qui vérifie qu'il existe bien 1 enregistrement correspondant à l'identifiant "id". Pour la simple raison que la vérification est redondante à la requête qui récupère l'url. Il ne faut pas raisonner de la manière suivante :

"Je vais vérifier que l'enregistrement existe et je vais récupérer les infos"

mais plutôt

"En voulant récupérer les infos, il va vérifier que l'enregistrement existe"

 

Le SGBD fait automatiquement un certain nombre de vérifications et de contrôles, n'hésitez pas à l'exploiter ce qui évitera de surcharger le code et de limiter les accès à la base de données.

 

Voilà, c'était mon conseil du jour. Notez qu'on peut garder la vérification de l'existence et du type de l'id...

 

J'ai utilisez aussi une alternative au header en redirigeant vers le fichier que l'on veut télécharger (via un meta-tag).

 

Bonne prog

Modifié par nessi
Posté(e)
J'ai utilisez aussi une alternative au header en redirigeant vers le fichier que l'on veut télécharger (via un meta-tag).
Disons que la solution avec l'interception du header et le transfert du fichier par un "streaming" assuré par PHP correspond à un choix tout autre que celui que tu as fait (où le client va recevoir une page HTML - peut-être malformée si tu oublies les balises <html> et <head> - et où c'est le serveur qui va assurer l'accès au fichier et son transfert). A partir de là, il faut voir si l'on veut surcharger PHP de boulot ou surcharger le serveur Web de requêtes :-P
Posté(e)
Disons que la solution avec l'interception du header et le transfert du fichier par un "streaming" assuré par PHP correspond à un choix tout autre que celui que tu as fait (où le client va recevoir une page HTML - peut-être malformée si tu oublies les balises <html> et <head> - et où c'est le serveur qui va assurer l'accès au fichier et son transfert). A partir de là, il faut voir si l'on veut surcharger PHP de boulot ou surcharger le serveur Web de requêtes :P

505037[/snapback]

 

Oui, l'un ou l'autre solution présente du bon et du mauvais, mais surtout sont traitées différemment. Les 'header' seront traités par le serveur lors de l'exécution du script (donc directement sur le serveur). Quant au métag-tag il sera ignoré par PHP, mais par contre traité par le client (navigateur) qui enverra la requête correspondante au serveur. La seule différence c'est l'appel puisqu'une fois engagée, le processus de téléchargement est le même. (corrige moi si je me trompe).

Posté(e)
Oui, l'un ou l'autre solution présente du bon et du mauvais, mais surtout sont traitées différemment. Les 'header' seront traités par le serveur lors de l'exécution du script (donc directement sur le serveur). Quant au métag-tag il sera ignoré par PHP, mais par contre traité par le client (navigateur) qui enverra la requête correspondante au serveur. La seule différence c'est l'appel puisqu'une fois engagée, le processus de téléchargement est le même. (corrige moi si je me trompe).

505076[/snapback]

Le processus de téléchargement passe, dans la première solution, par une ouverture du fichier par PHP puis son envoi direct dans la "page" générée par PHP ; il passe, dans la seconde solution, par une redirection vers l'URI du fichier qui sera traitée directement par le serveur Web (serveur Web qui, de toute façon, finit par générer et envoyer exactement le même contenu que ce que tu faisais en PHP en écrivant toi-même les headers). Côté client c'est totalement transparent puisqu'il se fiche de savoir quel est le processus distant qui lui répond.

Du point de vue du navigateur Web, l'unique différence vient du fait qu'il y a un "refresh" à faire avant d'obtenir le fichier.

Du point de vue du serveur, la différence vient du fait que dans le cas de la redirection on évite de faire bosser PHP pour un envoi de fichier (le serveur Web se débrouille tout seul, et puis d'abord c'est son boulot d'envoyer des fichiers aux gens qui les demandent !) :-)

Posté(e)
l'unique différence vient du fait qu'il y a un "refresh" à faire avant d'obtenir le fichier.

505559[/snapback]

 

Je comprends pas ce que tu veux dire par "refresh". Si tu veux dire par là que la redirection par meta-tag ne se fait pas toute seule immédiatement et nécessite l'intervention de l'utilisateur, c'est faux : quel que soit sa position dans la page web (pas forcément entre les balises HEAD), la redirection est pris en compte immédiatement après traitement du code en amont.

 

L'avantage aussi du metat-tag c'est que tu peux programmer la redirection après tant de secondes, du coup tu peux en profiter pour afficher des pubs de sponsors le tant de la redirection. D'ailleurs, on ne peut pas vraiment parler d'une redirection puisqu'une nouvelle page n'est pas chargée, mais plutôt d'un pointeur sur fichier.

Posté(e)
Je comprends pas ce que tu veux dire par "refresh". Si tu veux dire par là que la redirection par meta-tag ne se fait pas toute seule immédiatement et nécessite l'intervention de l'utilisateur, c'est faux : quel que soit sa position dans la page web (pas forcément entre les balises HEAD), la redirection est pris en compte immédiatement après traitement du code en amont.
Ce que je désigne par "refresh", c'est le résultat de la présence de cette balise dans le code de la page : <meta http-equiv="refresh" content="5; url="'.$filehttp://.'">

Il n'est évidemment pas question d'intervention de la part de l'utilisateur, je parlais au niveau du navigateur. Il fait deux requêtes auprès du serveur, la première avec cette page de redirection et la seconde pour obtenir le fichier.

D'ailleurs, on ne peut pas vraiment parler d'une redirection puisqu'une nouvelle page n'est pas chargée, mais plutôt d'un pointeur sur fichier.
Quelle différence entre une "page" (une URI pointant sur un fichier html, qu'il soit généré ou non d'ailleurs) et un "pointeur sur un fichier" (tu veux parler d'une URI) ? Quoi qu'il arrive, et même en passant par une "redirection PHP" (réponse HTTP 302 que le navigateur reçoit et qui lui indique que le document demandé a déménagé à l'adresse fournie) le navigateur va envoyer deux requêtes HTTP au serveur (une pour la page de redirection et une autre pour le fichier).
  • Tonton a modifié le titre en Compteur sur un lien de téléchargement

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...