IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Compteurs de clics sur des liens


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut Compteurs de clics sur des liens
    Bonjour,

    Je viens de me mettre au php par nécessité. En effet j'ai décidé d'établir dans le menu d'un site le nombre de téléchargements de fichiers à partir de ce menu.
    Pour être plus clair lorsque le menu déroulant fait apparaitre les fichiers à télécharger, chacun d'eux est suivi du nombre de téléchargements dont il a profité,
    du type Fichier Machin.zip téléchargé X fois.
    Mais lorsque l'on clique sur un lien pour un nouveau téléchargement, le nombre de ce dernier n'est mis à jour qu'à la cession suivante ou si rafraichit la page.
    Quelqu'un connait-il la procédure à employer pour mettre à jour l'affichage instantanément ?

    Voici deux petits fichiers qui illustrent mon soucis...
    le premier :
    Code Demo_4.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <font face=verdana size=1><a href=clic.php?url=http://fabien.fd.free.fr/Bourse/Applications/aide_Nina.zip>Récupérer</a><br>
    Nombre de téléchargements :<?include"telechargements/http:__fabien.fd.free.fr_Bourse_Applications_aide_Nina.zip.txt"?></font>
    le second :
    Code clic.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    error_reporting(E_ALL ^ E_NOTICE);
     
    $fichier=str_replace ("/", "_", "$url"); // remplacement des caractères spéciaux dans les noms de fichiers
    $fichier="telechargements/".$fichier.".txt"; // ouvrir le fichier texte pour chaque telechargement
    if(!file_exists("telechargements"))    //  ouvrir le fichier nommé telechargements
    {mkdir("data",0755);}                  // chmoder le fichier ( permettre l'ecriture sur ceux-ci )
    if(!file_exists("$fichier")){          // si le fichier existe
    $fp=fopen("$fichier","w");             // écriture sur le fichier
    fputs($fp,"0");
    fclose($fp);}
    $fp=fopen("$fichier","r+");
    $nb=fgets($fp,10);
    $nb++;
    fseek($fp,0);
    fputs($fp,$nb);
    fclose($fp);
    Header("Location:$url");
    ?>

    merci par avance.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 857
    Points : 6 555
    Points
    6 555
    Par défaut
    Il faut utiliser l'ajax, ce qui signifie qu'un script javascript envoie un requête au serveur (basiquement à un script php qui incrémente le nombre de click) et récupère la réponse du serveur (ce que renvoie le script php: "ok, l'incrementation c'est bien passée voici la nouvelle valeur, ou pas") et en fonction de la réponse change dynamiquement le compteur sur la page, le tout sans la recharger.

    Il y a un foultitude de tutoriels sur ajax, tu devrais trouver facilement ton bonheur.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Bon ben encore de nouvelles choses à apprendre et à digérer.

    Merci pour l'information.

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Bonsoir,

    J'ai installé un serveur local Wamp et j'ai testé le clic.php en local et en réel sur mes pages perso avec le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <font face=verdana size=1><a href=clic.php?url=image.zip>Télécharger</a><br>
    Nombre de téléchargements :<?include"telechargements/image.zip.txt"?></font>
    Quelle n'a pas été ma surprise... alors que tout fonctionne parfaitement sur les PP je reçois ce message d'erreur en local...
    La page n'est pas redirigée correctement
    Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas.
    De plus, le fichier image.zip.txt est correctement incrémenté sur les PP mais pas en local....

    A quoi serait due cette différence de comportement svp ?

    Merci par avance

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Comme tu l'as probablement deviné, c'est un problème de redirection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $fichier = str_replace ('/', '_', $url);
    ...
    header("Location: $url");
    $url n'est jamais définie dans ton script, donc le navigateur reçoit un ordre de redirection vers null. Le message d'erreur n'est pas très explicite mais ça signifie en gros « l'adresse de redirection qu'on m'a donnée n'est pas valide ».

    Dans d'anciennes versions de PHP on utilisait une option de configuration appellée register_globals qui permettait d'avoir automatiquement accès aux données de formulaire venant du client, sous la forme de variables. Cette option a été retirée car elle posait des problèmes de sécurité qui sont expliqués ici.

    Le fait que ton script marche sur ton serveur de prod signifie que celui-ci utilise une version de PHP obsolète. Essaye de corriger ça si c'est possible.

    Edit: ah bah oui tu es chez Free, j'avais pas vu. Tu as accès à la version 5.1.3 (c'est mieux que rien) si tu crées un .htaccess à la racine et que tu y mets ceci :
    Comme tu peux le voir c'est tout à fait limpide.

    Le plus simple pour faire fonctionner ton script avec une version de PHP à jour, c'est de rajouter ceci au début du code :

    PS. Je te conseille vivement d'afficher toutes les erreurs sur ton serveur de dev (WAMP).
    Ça te signalera notamment les endroits où tu utilises une variable non définie. Ce genre de signalement est de niveau E_NOTICE donc avec ton code actuel tu ne les vois pas. Comme expliqué dans les liens que j'ai mis ci-dessus, les variables indéfinies sont parfois des failles de sécurité.

    Il peut arriver que $_GET['url'] ne soit pas définie, par exemple si l'utilisateur arrive sur la page en tapant l'adresse à la main. Pour éviter une E_NOTICE dans ce cas, le plus propre est de vérifier si la donnée est présente avec la construction isset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (isset($_GET['url'])) {
      $url = $_GET['url'];
    } else {
      echo '<p>Il manque l’url du fichier…</p>';
      exit;
    }
    Cela t'incite également à prévoir ce que ton script doit faire quand la donnée est absente. Dans mon exemple un petit message explicatif pour l'utilisateur et un exit qui arrête l'exécution du script.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Tout d'abord grand merci pour le suivi pédagogique.

    Dans un premier temps, comme je m'initie au php depuis très peu de temps je pensais comme en prog objet que le fait d'écrire l'instruction
    permettait de transmettre directement l'adresse par valeur dans une variable notée "$url" convenue.
    Ayant parcouru des FAC sur les instructions GET et POST, je n'avais pas envisagé le problème sous cet aspect.
    Donc effectivement il faut transmettre auparavant l'adresse et tester son existence et tout fonctionne pour le mieux.

    Concernant le fichier .htaccess, j'en ai placé un à la racine de mes PP pour éviter les remontées trop curieuses et j'y ai placé l'instruction Quelle sera le rôle de l’instruction Faut-il la placer avant ou après ?

    Concernant...
    Je te conseille vivement d'afficher toutes les erreurs sur ton serveur de dev (WAMP).
    Je n'ai aucune idée de l'endroit où la placer.

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par F@bien.fd Voir le message
    Tout d'abord grand merci pour le suivi pédagogique.
    De rien !

    Concernant le fichier .htaccess, j'en ai placé un à la racine de mes PP pour éviter les remontées trop curieuses et j'y ai placé l'instruction Quelle sera le rôle de l’instruction Faut-il la placer avant ou après ?
    Peu importe, ça marchera avant et après.

    Concernant... Je n'ai aucune idée de l'endroit où la placer.
    En fait ce que je te suggérais c'est de remplacer le error_reporting(E_ALL ^ E_NOTICE) actuellement présent dans ton code (qui signifie « toutes les erreurs sauf les E_NOTICE ») par error_reporting(-1) qui est le niveau d'erreur absolu : tous les niveaux d'erreurs, y compris des niveaux qui pourraient être créés dans des versions futures de PHP, sont affichés. Il y a eu un cafouillage entre PHP 5.0 et PHP 5.4 (tiens donc, la 5.1 de Free est concernée…) où les erreurs de niveau E_STRICT n'étaient plus affichées quand on demandait seulement E_ALL, donc pour éviter ce genre de problème, on met -1 et pis valà.

    Si un jour tu te demandes à quoi correspondent tous ces niveaux d'erreurs, il y en a une liste exhaustive ici.

    À présent ton problème c'est de faire en sorte que les erreurs se produisant sur ton serveur de prod ne remontent pas toutes joyeusement crier les faiblesses de tes scripts au premier visiteur venu. Ça a été mon problème aussi pendant un moment. J'étais persuadé que modifier cette ligne à chaque fois, juste avant d'envoyer le fichier par FTP, était une façon raisonnable de procéder – j'étais jeune et insouciant.

    La solution la plus pérenne que j'ai trouvée, c'est de tester le nom du serveur tel que tapé dans la barre d'adresse. Cette valeur est portée par la variable $_SERVER['HTTP_HOST']. Avec WAMP il n'y a que deux noms possibles : 'localhost' ou '127.0.0.1'. Du coup je me suis fabriqué cette petite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function set_error_reporting() {
       switch ($_SERVER['HTTP_HOST']) {
          case 'localhost':
          case '127.0.0.1':
             // environnement de dev
             return error_reporting(-1);
          default:
             // environnement de prod
             return error_reporting(0);
       }
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin

    En fait ce que je te suggérais c'est de remplacer le error_reporting(E_ALL ^ E_NOTICE) actuellement présent dans ton code (qui signifie « toutes les erreurs sauf les E_NOTICE ») par error_reporting(-1) qui est le niveau d'erreur absolu.
    Merci pour cette précision particulièrement importante. Encore un point que j'ignorais
    Citation Envoyé par Watilin
    liste exhaustive ici.
    sacrément utile.
    Citation Envoyé par Watilin
    À présent ton problème c'est de faire en sorte que les erreurs se produisant sur ton serveur de prod ne remontent pas toutes joyeusement crier les faiblesses de tes scripts.
    La solution la plus pérenne que j'ai trouvée, c'est de tester le nom du serveur tel que tapé dans la barre d'adresse. Cette valeur est portée par la variable $_SERVER['HTTP_HOST']. Avec WAMP il n'y a que deux noms possibles : 'localhost' ou '127.0.0.1'. Du coup
    Je connaissait ces deux noms exclusifs mais ne savait pas les utiliser.
    La procédure fournie est top.

    Dernière petite précicision... le php 1 dans .htaccess, son rôle exact ?

    Je viens de tout tester sur le Prod et en local et cette fois j'ai bien une remonté des nombres de clic sur le prod mais pas en local (ce qui ne me gène pas car l'important est l'exactitude et le fonctionnement sur les PP, mais j'aimerais comprendre tout de même).

    Pour finir quelques explication pour la cause de mes demandes d'info.
    Ayant réalisé une appli, j'ai proposé à quelqu'un qui m'avait fourni des infos de la mettre à disposition de ses aficionados. Après avoir été submergé de demandes de téléchargements et d'explications, j'ai recherché un site où distribuer gratuitement.
    J'ai compété par un mini site dédié et une aide en ligne. Mais le site de distribution gratuite sera désactivé en fin de mois. Donc je me suis penché sur le php pour faire apparaitre sous une autre formule le nombre de téléchargement des différents éléments.
    Il me restera par la suite à renvoyer dynamiquement les valeurs des nombres de clics sans recharger la page. Apparemment AJAX me sera d'un grand secours.

    Pour info voici l'appli NinaPerf et le site dédié Site en html à l'heure actuelle .

  9. #9
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par F@bien.fd Voir le message
    Dernière petite précicision... le php 1 dans .htaccess, son rôle exact ?
    C'est une option de config spécifique aux serveurs de Free. Comme chez Free il y a deux versions de PHP (la 4.4 et la 5.1) et c'est la 4.4 par défaut, le fait d'écrire php 1 signifie « je veux l'autre version ». Ils ont choisi (maladroitement) de nommer cette option de configuration php tout court. Moi à leur place j'aurais choisi usePhp5 ou même simplement php5 mais eux ils ont fait comme ça.
    Quant au 1, il est là pour occuper l'espace C'est assez curieux, je viens de tester et apparemment, n'importe quel mot active la version 5, du moment qu'il y a quelque chose et qu'il n'y a pas d'espaces (sinon bam, erreur 500). Ça me fait bien rigoler, et à partir de maintenant mon .htaccess contiendra ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php this-is-a-magical-world-of-colorful-ponies
    La communauté des adorateurs de Free est un milieu assez discret, mais en cherchant bien on arrive à trouver des trucs intéressants, par exemple une rumeur pas trop vieille (un commentaire du 4 septembre sur cette page) qui dit que Free pourrait migrer ses Pages Perso vers la version PHP 5.5 prochainement. Affaire à suivre.

    Je viens de tout tester sur le Prod et en local et cette fois j'ai bien une remonté des nombres de clic sur le prod mais pas en local (ce qui ne me gène pas car l'important est l'exactitude et le fonctionnement sur les PP, mais j'aimerais comprendre tout de même).
    Je peux voir la nouvelle version de ton code ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  10. #10
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin Voir le message
    . Ça me fait bien rigoler, et à partir de maintenant mon .htaccess contiendra ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php this-is-a-magical-world-of-colorful-ponies
    Moi je vais rester modeste et je ne ferai pas le malin je vais conserver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Options -Indexes
    php 1
    Citation Envoyé par Watilin
    Je peux voir la nouvelle version de ton code ?
    bien sûr, mais en fait je me suis mal exprimé, le fichier .txt est bien incrémenté, c'est l'affichage initial qui n'apparaît pas en local alors qu'il apparaît chez Free.
    clic.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    function set_error_reporting() {
       switch ($_SERVER['HTTP_HOST']) {
          case 'localhost':
          case '127.0.0.1':
             // environnement de dev
             return error_reporting(-1);
          default:
             // environnement de prod
             return error_reporting(0);
       }
    }
    /* script téléchargé sur La Page Magique et amélioré avec l'aide de Watilin
    java, javascript, dhtml, css, php, css, mysql, vml, dictaticiels
    Site Web : http://lapagemagique.fr
    */
    if (isset($_GET['url'])) {
      $url = $_GET['url'];
    } else {
      echo '<p>Il manque l’url du fichier…</p>';
      exit;
    }
    $fichier=str_replace ("/", "_", "$url"); // remplacement des caractères spéciaux dans les noms de fichiers
    $fichier=str_replace ("http:", "", $fichier); 
    $fichier="telechargements/".$fichier.".txt"; // ouvrir le fichier texte pour chaque telechargement
    if(!file_exists("telechargements"))    //  ouvrir le fichier nommé telechargements
    {mkdir("data",0755);}                  // chmoder le fichier ( permettre l'ecriture sur ceux-ci )
    if(!file_exists("$fichier")){          // si le fichier existe
    $fp=fopen("$fichier","w");             // écriture sur le fichier
    fputs($fp,"0");
    fclose($fp);}
    $fp=fopen("$fichier","r+");
    $nb=fgets($fp,10);
    $nb++;
    fseek($fp,0);
    fputs($fp,$nb);
    fclose($fp);
    Header("Location:$url");
    ?>
    demo 4.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <font face=verdana size=1><a href=clic.php?url=http://fabien.fd.free.fr/Bourse/Applications/aide_Nina.zip>Récupérer http://fabien.fd.free.fr/Bourse/Applications/aide_Nina.zip</a><br>
    Nombre de téléchargements :<?include"telechargements/__fabien.fd.free.fr_Bourse_Applications_aide_Nina.zip.txt"?></font>
    Pour finir voici ma page index.php de Ninaperf, il me restera à construire une page de redirection à partir de l'ancienne page html pour tous ceux qui déjà stocké le lien du site dédié à l'appli.
    Ninaperf.php.

  11. #11
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ok, deux petites remarques :
    - maintenant que tu as déclaré la fonction set_error_reporting, il faut l'appeler, sinon, bah elle sert à rien.
    - attention à la lisibilité de ton code. Il y a des outils pour t'aider à le formater, PHP Beautifier n'est qu'un exemple parmi d'autres.

    Citation Envoyé par F@bien.fd Voir le message
    bien sûr, mais en fait je me suis mal exprimé, le fichier .txt est bien incrémenté, c'est l'affichage initial qui n'apparaît pas en local alors qu'il apparaît chez Free.
    Par « affichage initial » tu veux dire quand le fichier n'existe pas encore, ou bien à chaque fois que tu ouvres la page ?

    En toute logique tu as deux compteurs différents car tu as deux fichiers .txt différents : l'un se trouve sur ton WAMP, l'autre se trouve sur ton espace Free.

    Tu vas sans doute trouver quelques fichiers bizarres dans ton dossier telechargements/ sur tes pages perso, j'ai fait quelques expériences avec ton script … Je te rassure tout de suite, en éliminant les / tu empêches déjà les attaques les plus dangereuses.

    Mes expériences prouvent que ton script crée des compteurs pour des fichiers qui n'existent pas. C'est dangereux de laisser l'utilisateur créer un nombre infini de fichiers car, même vide, un fichier occupe de la place (la taille d'un bloc disque). En plus, comme tous tes fichiers sont dans le même dossier, en avoir des milliers fait gonfler l'index du dossier, et ça peut provoquer des timeouts. Si tu ralentis trop souvent le serveur mutualisé qui sert tes pages, tu risques de te prendre une sanction.

    Pour corriger ça, ajoute une vérification file_exists sur $url également. Et hop, à l'abri du mauvais temps
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  12. #12
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Encore merci pour ce suivi.
    Citation Envoyé par Watilin Voir le message
    - maintenant que tu as déclaré la fonction set_error_reporting, il faut l'appeler, sinon, bah elle sert à rien.
    - attention à la lisibilité de ton code. Il y a des outils pour t'aider à le formater, PHP Beautifier n'est qu'un exemple parmi d'autres.
    Suite à tes conseils et après la déclaration de la fonction concernée, l'erreur récurrente de redirection sur la page locale ayant disparue, je pensais donc à tort que l'appel à clic.php l'appelait automatiquement de façon transparente... donc à quel endroit dois-je l'appeler puisque à priori, l'erreure ne se reproduit plus ?
    Pour la rédaction du fichier j'utilise Notepad ++. Je vais voir voir un peu plus loin.
    Citation Envoyé par Watilin
    Par « affichage initial » tu veux dire quand le fichier n'existe pas encore, ou bien à chaque fois que tu ouvres la page ?
    Dès que j'ouvre la page en local.
    Les fichier sont immédiatement créés sans problème, mais l'affichage de l'index est inexistant même quand le fichier existe déjà.
    Chez Free pas de problème.
    Citation Envoyé par Watilin
    En toute logique tu as deux compteurs différents car tu as deux fichiers .txt différents : l'un se trouve sur ton WAMP, l'autre se trouve sur ton espace Free.
    On est d'accord là dessus. Ceux chez Free sont lus immédiatement et les résultats sont affichés d'emblée sur les pages concernées (sans rafraichissement puisque pas demandé) alors qu'en local même s'ils sont incrémentés, les valeurs qu'ils contiennent ne sont pas affichées.
    Citation Envoyé par Watilin
    Tu vas sans doute trouver quelques fichiers bizarres dans ton dossier telechargements/ sur tes pages perso, j'ai fait quelques expériences avec ton script … Je te rassure tout de suite, en éliminant les / tu empêches déjà les attaques les plus dangereuses.
    Aucun fichier bizarre, mais qu'est-ce que signifie bizarre ?
    je pense qu'il s'agit de tentative_d_injection_de_fichiers_par_Watilin_;).txt.
    Donc le script doit éliminer les /, c'est à dire les supprimer comme je l'ai fait pour http: et non simplement les remplacer par _?
    Citation Envoyé par Watilin
    Mes expériences prouvent que ton script crée des compteurs pour des fichiers qui n'existent pas. C'est dangereux de laisser l'utilisateur créer un nombre infini de fichiers car, même vide, un fichier occupe de la place (la taille d'un bloc disque). En plus, comme tous tes fichiers sont dans le même dossier, en avoir des milliers fait gonfler l'index du dossier, et ça peut provoquer des timeouts. Si tu ralentis trop souvent le serveur mutualisé qui sert tes pages, tu risques de te prendre une sanction.
    Là je ne pige pas, si j'ai quatre liens correspondant chacun à un fichier différent et que chacun est vérifié et filtré, je ne comprends pas pourquoi il pourrait y avoir un nombre de fichiers infini, il ne doit y en avoir que quatre.
    Citation Envoyé par Watilin
    Pour corriger ça, ajoute une vérification file_exists sur $url également. Et hop, à l'abri du mauvais temps
    C'est pas ce qui est réalisé avec le test de l'url ? Attention je suis débutant en php.

    J'ai réalisé le fichier de redirection qui me permettra de passer intégralement en php tout en laissant en place les pages actuelles en html.
    Testé cette nuit apparemment sans encombre.

  13. #13
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par F@bien.fd Voir le message
    […] à quel endroit dois-je l'appeler puisque à priori, l'erreure ne se reproduit plus ?
    En fait maintenant que tu me poses la question, je trouve ça inutile de déclarer une fonction pour un code qui ne doit être exécuté qu'une seule fois. Oublie donc cette fonction et exécute directement les instructions qui sont dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch ($_SERVER['HTTP_HOST']) {
       case 'localhost':
       case '127.0.0.1':
          // environnement de dev
          return error_reporting(-1);
          break;
       default:
          // environnement de prod
          return error_reporting(0);
    }
    Edit: j'ai supprimé les return… Sinon ça n'avait aucune chance de marcher

    Avec ça on aura peut-être enfin des indices sur ce compteur qui ne s'affiche pas.

    Je viens de voir un truc dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!file_exists('telechargements')) {
       mkdir('data', 0755);
    }
    Ça ne devrait pas plutôt être mkdir('telechargements', 0755); ? C'est tellement gros, c'est possible qu'on soit passés dessus cent fois sans voir le problème.

    Donc le script doit éliminer les /, c'est à dire les supprimer comme je l'ai fait pour http: et non simplement les remplacer par _?
    En fait peu importe, quand je disais éliminer je ne voulais pas forcément dire supprimer… L'important c'est que les / ne soient plus là

    Là je ne pige pas, si j'ai quatre liens correspondant chacun à un fichier différent et que chacun est vérifié et filtré, je ne comprends pas pourquoi il pourrait y avoir un nombre de fichiers infini, il ne doit y en avoir que quatre.
    J'ai refait quelques expériences, j'ai tapé les adresses suivantes dans mon navigateur :
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    http://ninaperf.free.fr/clic.php?url=a
    <a href="http://ninaperf.free.fr/clic.php?url=b" target="_blank">http://ninaperf.free.fr/clic.php?url=b</a>
    <a href="http://ninaperf.free.fr/clic.php?url=c" target="_blank">http://ninaperf.free.fr/clic.php?url=c</a>
    <a href="http://ninaperf.free.fr/clic.php?url=d" target="_blank">http://ninaperf.free.fr/clic.php?url=d</a>
    <a href="http://ninaperf.free.fr/clic.php?url=e" target="_blank">http://ninaperf.free.fr/clic.php?url=e</a>

    Et j'ai été redirigé vers les adresses http://ninaperf.free.fr/a, http://ninaperf.free.fr/b, etc., ce qui signifie que le script a été jusqu'au Header qui est tout en bas, en passant forcément par les fopen. Le problème est que les fichiers a, b, etc. n'existent pas, mais un compteur est quand même créé pour chacun. Donc tant que tu me permettras d'envoyer n'importe quel paramètre url à ton script, je serai capable de créer des fichiers sur ton serveur.

    C'est pas ce qui est réalisé avec le test de l'url ? Attention je suis débutant en php.
    Non, le test vérifie simplement que le paramètre est présent.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #14
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin Voir le message
    En fait maintenant que tu me poses la question, je trouve ça inutile de déclarer une fonction pour un code qui ne doit être exécuté qu'une seule fois.
    ...
    Avec ça on aura peut-être enfin des indices sur ce compteur qui ne s'affiche pas.
    Ben non justement, si on supprime la fonction plus rien n'est affiché
    Citation Envoyé par Watilin
    Je viens de voir un truc dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!file_exists('telechargements')) {
       mkdir('data', 0755);
    }
    Ça ne devrait pas plutôt être mkdir('telechargements', 0755); ? C'est tellement gros, c'est possible qu'on soit passés dessus cent fois sans voir le problème.
    Si mais j'avais initialement commis une erreur dans le code transmis, en effet le code actif est bien mkdir('telechargements', 0755);, je l'avais bien corrigé mais j'ai oublié de rectifier ici.
    J'avais mis double guillemets au lieu de simple (mais dans ce cas il me semble que les deux syntaxes sont convenables), j'ai remplacé par des simples et cela n'avance pas plus.
    Citation Envoyé par Watilin
    guillemet
    En fait peu importe, quand je disais éliminer je ne voulais pas forcément dire supprimer… L'important c'est que les / ne soient plus là
    C'est bien le cas.
    Citation Envoyé par Watilin
    J'ai refait quelques expériences, j'ai tapé les adresses suivantes dans mon navigateur :
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    http://ninaperf.free.fr/clic.php?url=a
    ...
    Et j'ai été redirigé vers les adresses http://ninaperf.free.fr/a,etc... Le problème est que les fichiers a, etc... n'existent pas, mais un compteur est quand même créé pour chacun.
    Je l'ai aussi vérifié sur tes conseils...
    Je suis redirigé vers la page Free ERREUR 404 - Document non trouvé, mais ça incrémente tout de même le compteur du fichier text.
    Là, je suis dans le potage...

  15. #15
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par F@bien.fd Voir le message
    Ben non justement, si on supprime la fonction plus rien n'est affiché
    Je comprends de moins en moins… Mets juste error_reporting(-1) pour l'instant, on verra bien ce que ça donne.

    J'avais mis double guillemets au lieu de simple (mais dans ce cas il me semble que les deux syntaxes sont convenables), j'ai remplacé par des simples et cela n'avance pas plus.
    La différence entre les deux types de guillemets est expliquée ici.

    Je l'ai aussi vérifié sur tes conseils...
    Je suis redirigé vers la page Free ERREUR 404 - Document non trouvé, mais ça incrémente tout de même le compteur du fichier text.
    Là, je suis dans le potage...
    L'idée que je proposais en fait, c'est de vérifier que l'url ne mène pas à une 404, autrement dit, qu'il y a quelque chose à cette adresse. Et pour tester ça : file_exists
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  16. #16
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Je comprends de moins en moins… Mets juste error_reporting(-1) pour l'instant, on verra bien ce que ça donne.
    Rien de mieux, là encore si je retire le script de la fonction, ça ne marche plus.
    Citation Envoyé par Watilin
    La différence entre les deux types de guillemets est expliquée ici.
    c'est bien ce que je pensais, là je ne me suis pas planté.
    J'ai installé le script sur une autre page avec des php demo dans lesquels pour certains le fichier à télécharger est dans le même dossier, donc je passe une adresse relative et pour d'autres le fichier à télécharger est sur une autre page donc là avec une adresse absolue.
    Les résultats sont plutôt mitigés avec la proposition qui suit...
    Citation Envoyé par Watilin
    L'idée que je proposais en fait, c'est de vérifier que l'url ne mène pas à une 404, autrement dit, qu'il y a quelque chose à cette adresse. Et pour tester ça : file_exists
    voici le code que j'ai réalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo 'Recherche du fichier<br><br>';
    if (isset($_GET['url'])) {
      $url = $_GET['url']; 
    } else {
      echo '<p>Il manque l’url du fichier…</p>';
      exit;
    }
    echo 'l\'url est';
    echo " $url<br>";
    if (file_exists($url)) {
      echo "Le fichier $url existe.";
    } else {
      echo "Le fichier $url n'existe pas.";
    }
    et là si j'appelle au téléchargement d'un fichier du même répertoire
    Télécharger image.zipNombre de téléchargements :15voici le message associé :
    Recherche du fichier

    l'url est image.zip
    Le fichier image.zip existe.
    Warning: Cannot modify header information - headers already sent by (output started at /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php:18) in /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php on line 47
    et le fichier texte est incrémenté.

    et là si j'appelle au téléchargement d'un fichier situé à une toute autre adresse
    Récupérer http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.rar

    Nombre de téléchargements :18
    voici le message associé :
    Recherche du fichier

    l'url est http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.rar
    Le fichier http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.rar n'existe pas... alors qu'il existe
    Warning: Cannot modify header information - headers already sent by (output started at /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php:18) in /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php on line 47
    et le fichier texte est incrémenté là aussi.

    la ligne 47 correspondant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Header("Location:$url");
    Mon potage s'épaissit donc dans le dernier cas si exit remplace echo, je sors alors que le fichier existe quand même...

  17. #17
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bon, le error_reporting(-1) marche on dirait, tu as un warning. On a enfin réussi à le faire parler !
    D'ailleurs, je viens de voir une grosse boulette dans mon code avec le switch : il reste les return dedans. Un return en dehors d'une fonction, c'est une erreur de parsing, fatale donc, du coup le error_reporting n'était pas appelé…

    Le warning est très simple, c'est une erreur classique : tu ne peux pas envoyer un header après avoir fait un echo. C'est dû au protocole HTTP : le serveur envoie d'abord les en-têtes (headers), puis le corps. Quand tu fais un echo, les en-têtes partent avec la première partie du corps, et ce n'est plus possible de modifier les en-têtes par la suite.

    Le problème du fichier qu'on croit qui n'existe pas mais qui n'existe, c'est peut-être à cause de ça (clic). Si par malchance il y a un truc qui n'a pas marché avec ton htaccess et que tu es toujours en version 4, fopen et file_exists ne reconnaissent pas les chemins commençant par http: et ça pourrait tout expliquer.
    Vérifie ta version de PHP avec un fichier contenant juste ceci :
    Tu l'as sans doute déjà compris mais je le dis pour être sûr : quand tu passes un chemin relatif à ton script, ce chemin est considéré comme partant du dossier contenant le script. Vérifie attentivement tes dossiers et sous-dossiers, il y a peut-être des fichiers qui se promènent un peu partout. La fonction realpath peut t'aider, mais elle est limitée, elle ne marche qu'avec les fichiers qui existent (et c'est bien dommage). Dans les commentaires de la page realpath il y a une fonction normalizePath, je ne sais pas ce qu'elle vaut mais tu devrais l'essayer.

    Les variables $_SERVER['DOCUMENT_ROOT'] et $_SERVER['SCRIPT_NAME'] pourraient t'être utiles également.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  18. #18
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Bon, le error_reporting(-1) marche on dirait, tu as un warning. On a enfin réussi à le faire parler !
    D'ailleurs, je viens de voir une grosse boulette dans mon code avec le switch : il reste les return dedans. Un return en dehors d'une fonction, c'est une erreur de parsing, fatale donc, du coup le error_reporting n'était pas appelé…
    comme la fonction est déclarée dès le début du fichier, elle est semble-t-il exécutée sauf erreur de ma part dès l'appelle include. Et apparemment les return présents ou absents n'ont rien changé (donc pour l'instant je les ai laissés).
    Citation Envoyé par Watilin
    Le warning est très simple, c'est une erreur classique du header après avoir fait un echo.
    ça au moins je l'avais lu et compris mais je n'avais pas d'autre solution pour voir où j'en étais, et évidemment les echo disparaitront lorsque j'aurai solutionné le problème que tu as soulevé.
    Citation Envoyé par Watilin
    Si par malchance il y a un truc qui n'a pas marché avec ton htaccess et que tu es toujours en version 4...
    PHP Version 5.4.31 lu avec le fichier
    Je l'ai aussi placé sur le serveur de chez Free et la No réponse ????
    De même avec un fichier dir.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo dirname(__FILE__);
    ?>
    J'obtiens le chemin complet de mon répertoire, mais chez Free j'obtiens que /mnt/154/sda/2/7/fabien.fd/ESSAIS. C'est peut-être là qu'est la solution du chemin réel !
    Citation Envoyé par Watilin
    Vérifie ta version de PHP avec un fichier contenant juste ceci :
    PHP Version 5.4.31
    Citation Envoyé par Watilin
    Tu l'as sans doute déjà compris mais je le dis pour être sûr : quand tu passes un chemin relatif à ton script, ce chemin est considéré comme partant du dossier contenant le script. Vérifie attentivement tes dossiers et sous-dossiers, il y a peut-être des fichiers qui se promènent un peu partout. La fonction realpath peut t'aider, mais elle est limitée, elle ne marche qu'avec les fichiers qui existent (et c'est bien dommage). Dans les commentaires de la page realpath il y a une fonction normalizePath, je ne sais pas ce qu'elle vaut mais tu devrais l'essayer.

    Les variables $_SERVER['DOCUMENT_ROOT'] et $_SERVER['SCRIPT_NAME'] pourraient t'être utiles également.
    J'avais commencé à examiner tout cela, et là j'ai parfois des soucis de compréhension ou de confusion avec d'autres démarches... dur dur d'être un bébé...

  19. #19
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    De quel appel include tu parles ? On parle de la page clic.php non ? Le error_reporting doit être appelé au tout début du script, ça doit vraiment être la première instruction exécutée.

    Comme je t'ai déjà dit, mets simplement error_reporting(-1); pour l'instant, tant qu'on n'y voit pas clair.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  20. #20
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Watilin Voir le message
    De quel appel include tu parles ? On parle de la page clic.php non ? Le error_reporting doit être appelé au tout début du script, ça doit vraiment être la première instruction exécutée.
    j'ai écrit include au lieu de clic qui appelle clic.php de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <font face=verdana size=1><a href=clic.php?url=image.zip>Télécharger image.zip</a><br>
    Nombre de téléchargements :<?include"telechargements/image.zip.txt"?></font>
    Citation Envoyé par Watilin
    Comme je t'ai déjà dit, mets simplement [codeinline
    error_reporting(-1);[/codeinline] pour l'instant, tant qu'on n'y voit pas clair.
    ]
    1-Deux essais en local avec : un fichier local et un fichier distants à télécharger, là ça roule et les fichiers .txt sont incrémentés voir créés.
    2-Deux essais en local avec : un fichier local et un fichier distants à télécharger mais qui n'existent pas

    réponse pour en local :
    Not Found
    The requested URL /ESSAIS/Compteur 1 telechargements/toto.zip was not found on this server.
    Apache/2.4.10 (Win32) OpenSSL/1.0.1h PHP/5.4.31 Server at localhost Port 80
    le fichier .txt est tout de même créé.

    réponse pour le distant :
    page Free émise avec le traditionnel message ERREUR 404 - Document non trouvé
    le fichier .txt est tout de même créé aussi.

    J'ai modifié le fichier clic pour en avoir le coeur net avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo realpath("$url");
    echo '<br>l\'url est';
    echo " $url<br>";
    en local les echo n'apparaissent pas mais chez Free voila ce que ça affiche :
    mon appel :
    Récupérer http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.zip
    Nombre de téléchargements :10

    La réponse :
    Recherche du fichier
    /mnt/154/sda/2/7/fabien.fd/ESSAIS/http:/fabien.fd.free.fr/Bourse/Applications/aide_Nina.zip
    l'url est http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.zip
    Le fichier http://fabien.fd.free.fr/Bourse/Appl.../aide_Nina.zip n'existe pas.
    Warning: Cannot modify header information - headers already sent by (output started at /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php:21) in /mnt/154/sda/2/7/fabien.fd/ESSAIS/clic.php on line 51
    l'url ne correspond pas au chemin réel... voilà pourquoi la réponse est négative.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utiliser des styles différents en fonction du clic sur un lien
    Par tahiiri dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 07/06/2009, 16h02
  2. [PHP-JS] Incrémenter compteur avec clic sur lien
    Par Bydouille dans le forum Langage
    Réponses: 5
    Dernier message: 12/11/2007, 16h32
  3. Compteur de clics sur lien en dur
    Par renaud26 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/06/2007, 10h53
  4. Réponses: 1
    Dernier message: 13/05/2007, 15h34
  5. [Tableaux] Réaliser un compteur de clic sur un lien
    Par Klimium dans le forum Langage
    Réponses: 15
    Dernier message: 22/10/2006, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo