8797 sujets

Développement web côté serveur, CMS

Bonjour,

voila j'ai crée un script qui crée un compteur de clic sur un lien et me recupere la date et l'url de provenance et cela dans deux fichiers separés. Quand j'ai fait mes premiers test tout fonctionné parfaitement mais la si l'la date et l'url est bien recuperer le compteur ne fonctionne plus et je ne voit pas pourquoi

Mon script :

<?php
session_start();
$uscookies="no";
$hours="24";
$date= date('d-m-Y');
$url=$date .'|'.$_SERVER["HTTP_REFERER"];

// NOM DES FICHIERS CLIC et URL
$file1="compteur.clic";
$file2="url.clic";
    
// VERIFICATION SI CLIC AUTORISE
if($uscookies=="yes")
	{
	if($pagevue==$file1) {$incr="no";}
        if($pagevue==$file2) {$incr="no";}   
	}
  
// CREATION DU FICHIER CLIC CORRESPONDANT A L'URL S'IL N'EXISTE PAS
if(!file_exists("$file1"))
{
     $fp=fopen("$file1","w");
     fputs($fp,"0");
     fclose($fp);

if(!file_exists("$file2"))
{
     $fu=fopen("$file2","w");
     fputs($fu,"URLSn");
     fclose($fu);
}
}
// INCREMENTATION DU COMPTEUR DE L'URL
if($incr!="no")
{
     $fp=fopen("$file1","r+");
     $fu=fopen("$file2","a+");
     $nb=fgets($fp,10);
     $nb++;
     fseek($fp,0);
     fwrite($fp,$nb);
     fwrite($fu,$url ."n");
     fclose($fp);
     fclose($fu);
} 
// POSE DU COOKIE ET REDIRECTION VERS L'URL

if($usecookies=="yes" && $incr!="no") {SetCookie("pagevue","$file1","$file2",time()+$hours*3600,"/","",0);}
header("location:" . $_SERVER["HTTP_REFERER"]);

?> 


Avez vous une idée?
Merci
Modifié par pcsystemd (24 Oct 2008 - 07:24)
Personnellement, je ferais comme ceci :
<?php
$fichier = 'compteur.txt';

if(!file_exists($fichier))
	die('Le fichier n\'existe pas !');

$compteur = (int) file_get_contents($fichier);
$compteur++;

if($fp = fopen($fichier,'w')) {
	fputs($fp, $compteur); 
	fclose($fp);
} else
	die('Ouverture du fichier impossible');

echo 'Visiteur n° ', file_get_contents($fichier); 
?>
Utilise
error_reporting(E_ALL); //(ou error_reporting(E_ALL|E_STRICT); si tu es sur PHP5

Juste après la balise <?php

Ainsi, tu verras que tu utilise une variable qui n'a pas été initialisée ($pagevue) (je vois bien que ça vient de ton cookie, mais comment le récupère tu là? Je crains le pire >_< )

Ensuite, j'aimerais que tu m'explique exactement le comportement attendu de ton script (Ex: on est sur telle page, il se passe telle ou telle action, puis on va sur telle page, il se passe ça, ça et ça, puis si on revient sur la première page, il doit se passer ça, etc) Histoire d'être certain que tu comprend bien ton script toi même...

Dernière chose:

- Lorsque tu assigne un nombre à une variable, NE PAS LE METTRE ENTRE GUILLEMETS (je l'écris en majuscule pour que tu le retienne Smiley cligne ) sinon, il passe en type "string". (ref.)


- Lorsque tu passe une variable, seule, comme argument
Ex:
fopen("$file1", "w");
NE PAS METTRE LA VARIABLE ENTRE GUILLEMETS (ça ne provoque pas d'erreur, mais c'est plus lent). Donc ça donnerait:
fopen($file1, 'w');
(Remarque au passage que j'ai mis "w" entre simple quote, vu qu'il n'y a pas de variable dans la chaîne, c'est traité plus vite) (ref.)

- Fais attention à ton indentation, tu te rendras compte que tu as un comportement que tu ne désire peut-être pas pour la création des fichiers..

- Sépare les traitements. Dans ta dernière partie de code (dans le if($incr!="no") ) tu traite en même temps, url et click, un coup l'un, un coup l'autre... C'est le bordel Smiley cligne
Rien ne t'empêche d'ouvrir un fichier, faire ce que tu as à faire dessus, le refermer, puis faire parreil avec l'autre.

Exemple, pour l'écriture des deux fichiers:
<?php
    if ( defined('E_STRICT') )  { error_reporting(E_ALL|E_STRICT); }
    else { error_reporting(E_ALL); }

    // for PHP < 5
    if ( !function_exists('fprintf') ) {
        function fprintf( /*...*/ ) {
            $args = func_get_args();
            $fp = array_shift($args);
            return fwrite($fp, call_user_func_array("sprintf", $args));
        }
    }

    $files = array('click' => 'click.dat', 'url' => 'urls.dat');


    // ... Some work here


    // Update counter
    if ( $fp = fopen($files['click'], 'w+') ) {
        $data = intval(fgets($fp));
        fwrite($fp, $data + 1);
        fclose($fp);
    }
    else {
        exit('Unable to open or create "'.$files['click'].'".');
    }

    // Update url list 
    if ( $fp = fopen($files['url'], 'a+') ) {
        fprintf($fp, "%s\t%s\n", date('d-m-Y'), $_SERVER["HTTP_REFERER"]);
        fclose($fp);
    }
    else {
        exit('Unable to open or create "'.$files['url'].'".');
    }
    // ... Some work here
?>

Modifié par Calak (23 Oct 2008 - 12:44)
Remarque, je te conseille de tester l'existence de cette variable : $_SERVER["HTTP_REFERER"]

C'est une valeur qui est affectée par le navigateur de l'internaute et certaines configurations réseaux (firewall ou proxy) de tes internautes n'affectent pas cette variable. En d'autres mots, il est possible que cette variable n'existe pas chez certaines personnes ; ce n'est pas une valeur de confiance !
Tout à fait, comme toute donnée issue d'une variable super-globale.

Mais ce n'était ici qu'a titre d'exemple Smiley cligne
Merci beaucoup pour les explications.

Pour t'expliquer mon script, je veux lorsque l'on clic sur un lien, que les clics soient comptabilisés et qu'il recupere la date et l'url de provenance et si on active $usecookies que la personne ne puisses plus cliquée pendant le temps assigné a la variable mais bon cela c'est juste pour m'entrainer car je ne l'utilise pas dans ce cas. De plus j'ai ajouté :
if ( defined('E_STRICT') )  { error_reporting(E_ALL|E_STRICT); }

    else { error_reporting(E_ALL); }


et voila ce que cela me donne :

Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /home/page.php on line 6

20 20

j'ai fait un echo de mon fichier de clicks avant lecteure et apres ecriture et cela me retourne la meme valeur 20 20, il ne s'incremente pas.


J'ai voulu teste ton script par curiosité car je ne l'utiliserais pas car je ne veux pas faire de copier/coller sans comprendre et pour le moment je debute mais j'ai une erreur a la ligne 61 :

Parse error: syntax error, unexpected T_STRING in chemin/page.php on line 61

 

    else {

        exit('Unable to open or create "'.$files['click'].'".);

    }



    // Update url list 

  [b]  if ( $fp = fopen($files['url'], 'a+') ) {[/b]

        fprintf($fp, "%s\t%s\n", date('d-m-Y'), $_SERVER["HTTP_REFERER"]);

        fclose($fp);

    }

    else {

        exit('Unable to open or create "'.$files['url'].'".);

    }

Modifié par pcsystemd (23 Oct 2008 - 12:33)
Oops, désolé. J'avais pas testé mon script:

Retire ce point à la fin:
exit('Unable to open or create "'.$files['click'].'"[b].[/b]);
                                                    ^
                                                    |

Il n'a rien à faire là >_<

Et quelques lignes plus bas, retire le même point à l'autre exit. (Copy/Past owned >_< )

Justement, essaye de comprendre mon code.
Commence par ce qui se trouve après le premier "// ... Some work here"

Regarde ligne par ligne ce qu'il se passe, et si tu ne comprend pas, regarde dans la documentation, à quoi sert la fonction Smiley cligne
Modifié par Calak (23 Oct 2008 - 12:27)
J'ai enlevé le point mais j'ai toujours la meme erreur. Je ne comprends pas :

Il n'a rien à faire là >_<
"Mode JE SUIS PAS RÉVEILLÉ"....



Je retire ce que j'ai dit, tu laisse le point et rajoute ' après. Ce qui donne, le code corrigé suivant:

<?php
    if ( defined('E_STRICT') )  { error_reporting(E_ALL|E_STRICT); }
    else { error_reporting(E_ALL); }

    // for PHP < 5
    if ( !function_exists('fprintf') ) {
        function fprintf( /*...*/ ) {
            $args = func_get_args();
            $fp = array_shift($args);
            return fwrite($fp, call_user_func_array("sprintf", $args));
        }
    }

    $files = array('click' => 'click.dat', 'url' => 'urls.dat');


    // ... Some work here


    // Update counter
    if ( $fp = fopen($files['click'], 'w+') ) {
        $data = intval(fgets($fp));
        fwrite($fp, $data + 1);
        fclose($fp);
    }
    else {
        exit('Unable to open or create "'.$files['click'].'".');
    }

    // Update url list 
    if ( $fp = fopen($files['url'], 'a+') ) {
        fprintf($fp, "%s\t%s\n", date('d-m-Y'), $_SERVER["HTTP_REFERER"]);
        fclose($fp);
    }
    else {
        exit('Unable to open or create "'.$files['url'].'".');
    }
    // ... Some work here
?>
Merci beaucoup, mais il y a un souci car lorsque je cliques sur le lien la première fois cela imcrémente bien le compteur a 1 mais apres plus rien, pas d'incrémentation cela reste a 1.
Désolé Alphonse,
mais ton script n'est pas vraiment ce que je souhaite puisqu'il ne recupere pas la date et l'url de provenance du clic. De plus je ne veux pas afficher les clicks ,je veux juste les loger dans un fichier pour extraire les resultats plutard. Mais ce n'est pas pour cela que je n'apprecie pas ton aide et que l'ai gardé ton script pour l'etudier plutard.

Calak, j'ai mis en ligne ton script pour le tester car, jusqu'a maintenant je teste en local et j'ai une autre erreur qui est la suivante :

Warning: fopen(click.dat): failed to open stream: Permission denied in /chemin.page.php on line 41
Unable to open or create "click.dat".

Je précise que les droits sont bon avec un chmod a 664 et bon utilisateur/group. Je pense que le souci c'est que je souhaite mettre les fichiers click.dat et url.dat dans un autre repertoire hors comment faire dans un tableau?
J'ai bien declare une variable avec le chemin dans mon script mais comment faire?

Merci
Modifié par pcsystemd (23 Oct 2008 - 15:10)
Pour ne pas afficher le résultat, tu supprimes tout simplement la ligne ! Smiley cligne

Et si t'arrives pas à modifier ce script pour qu'il ajoute la date et l'url de provenance au lieu d'ajouter la valeur du compteur, je te recommande de revoir les bases du PHP.
a écrit :
ai gardé ton script pour l'etudier plutard
Heu... y a rien à étudier... y a pas plus simple comme script !
En fait, les noms de fichiers dans le tableau, ce sont les chemins relatifs Smiley cligne

(je les ai juste regroupés dans un tableau pour que ce soit plus propre)

donc par exemple:
files = array('click' => './un/repertoire/click.dat', 'url' => './ailleurs/urls.dat');



Par contre, faut vraiment que je me remette ay php, je fais des erreurs de débutant -_-


Cette fois-ci, je l'ai testé.

Remplace la partie Update counter par celle là:

    // Update counter
    touch($files['click']);
    if ( $fp = fopen($files['click'], 'r+b') ) {
        $data = stream_get_line($fp, 1024);
        rewind($fp);
        fwrite($fp, $data + 1);
        fclose($fp);
    }
    else {
        exit('Unable to open or create "'.$files['click'].'".');
    }



Et Alphonse à raison, cheche à comprendre... Si c'est pour faire du copy/paste, prend directement un script qui fait ce que tu veux...
Alors te répondre Alphonse, effectivement la simplicité cela depend d'ou on se place. Pour moi ce n'est pas simple car il y a une semaine je ne savais pas ce qu'était codé en PHP donc effectivement cela me parait compliqué et c'est pourquoi je dois étudié ton code pour le comprendre.

Calak, milles merci mais j'ai une erreur ligne 45 avec la fonction stream_get_line() dans le block update counter que tu viens de me donner. Voici l'erreur :

Fatal error: Call to undefined function: stream_get_line() in /home/page.php on line 45


La ligne 45 correspond a :
$data = stream_get_line($fp, 1024);


Merci encore a vous deux.
Bon j'ai trouvé,

j'ai remplacé stream_get_line par fgets et cela fonctionne parfaitement. Merci a vous pour cette aide précieuse.
Simplement que tu n'utilise pas php5...

Si tu allais voir la doc officielle, tu verrais que stream_get_line est une fonction php5...

Donc, avant de poser ta prochaine question php qui n'a pas de rapport avec l'accessibilité, essaye de chercher par toi même. Ce n'est pas en te donnant tout tout cuit que tu t'amélioreras Smiley cligne