erreur mktime() sur un compteur ip

Eléphanteau du PHP | 26 Messages

28 sept. 2007, 11:55

Bonjour

J ai un code en php qui me permet de compter le nombre de visite et de connecte actuel

Pour cela, j ai un fichier cmpt.php, un fichier compteur.txt, et ip.txt

Le fichier controle avec la fonction mktime si le visiteur est deja venu sur le site aujourd hui

Mon probleme est que cela fonctionne bien lorsque je detruit les 2 fichiers texte, mais des qu ils ont ete crees, j ai un message d'erreur :

"Warning: mktime() expects parameter 1 to be long, string given in C:\wamp\www\cmpt.php on line 29

Warning: mktime() expects parameter 1 to be long, string given in C:\wamp\www\cmpt.php on line 33"

qui s affiche au dessus du comteur, mais celui ci fonctionne.

Voici les lignes qui posent probleme :
if ($now_time < mktime($heure, $minute, $seconde, $mois, $jour, $annee) + 180)
				$nbr_connect++;
			
			// Si l'IP est là depuis plus du time-out
			if ($now_time < mktime($heure, $minute, $seconde, $mois, $jour, $annee) + 3600 * $timeout_cmpt)
			{
				if ($REMOTE_ADDR == $subdata[0])
					$var_bool = true;
		
				$var_ip .= $record_cm;
			}
Je ne souhaite pas trouver un autre systeme, mais comprendre pourquoi cette erreur apparait.

Format du fichier compteur.txt :
128/09/2007
premier chiffre le nombre total de visite, second la date de depart

format fichier ip.txt :
28/09/2007 11:17:10

Il y un espace avant les entrees ???? la date du jour et l heure de la connexion

Voila j ai essaye d etre le plus claire possible

Merci de m expliquer pourquoi ca marche pas.

ViPHP
ViPHP | 4039 Messages

28 sept. 2007, 12:07

Salut,
au premier regard, $heure est une chaine au lieu d'être un int. (du donnes du texte au lieu de chiffres).

Fais un echo sur $heure pour savoir ce qu'il contient une fois récupére, ou dis nous comment tu récupères les infos des fichiers texte, vu que la aussi y'a un souci.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 26 Messages

28 sept. 2007, 12:22

Voici le code complet du fihier php
ce dode je l ai recupere sur internet
function cmpt_visit($ip_file_cmpt, $file_cmpt, $timeout_cmpt = 2)
{
	// Fonction Hard Compteur par [email protected] v0.6
	global $REMOTE_ADDR;
	$nbr_connect = 0;

	//$var_ip = "<?die (\"<pre>Impossible d'accéder à cette ressource !</pre>\")\n";

	if($fp = @file($ip_file_cmpt))
	{
		$now_time = time();
	
		foreach ($fp as $record_cm)
		{
			$subdata = explode("\t", $record_cm);
		
			list($jour, $mois, $annee) = explode("/", substr($subdata[1], 0, 10));
			list($heure, $minute, $seconde) = explode(":", substr($subdata[1], 10, 18));
			
			// Prise du nombre de connecté (les 5 derniere minutes)
			if ($now_time < mktime($heure, $minute, $seconde, $mois, $jour, $annee) + 180)
				$nbr_connect++;
			
			// Si l'IP est là depuis plus du time-out
			if ($now_time < mktime($heure, $minute, $seconde, $mois, $jour, $annee) + 3600 * $timeout_cmpt)
			{
				if ($REMOTE_ADDR == $subdata[0])
					$var_bool = true;
		
				$var_ip .= $record_cm;
			}
		}
	}
	
	// Prise des infos
	$fp = fopen($file_cmpt, "a+");		// Ouverture du fichier en Lecture / Ecriture
	$nbr_visit = trim(fgets($fp, 100));	// Prise du nombre de connectés
	$date_start = trim(fgets($fp, 100));	// Prise de la date

	// Création des bonnes valeurs
	if($nbr_visit == "")
	{
		$nbr_visit = 0;
		fputs($fp, "$nbr_visit");
	}
	if($date_start == "")
	{
		$date_start = date("d/m/Y");
		fputs($fp, "\n".$date_start);
	}

	fclose($fp);				// Fermeture fichier
	
	// On augmente si l'IP n'est pas encore connu...
	if (!$var_bool)
	{
		$fp = @fopen($file_cmpt, "w");		// Ouverture du fichier en écriture
		$nbr_visit++;				// Augmentation du compteur
		fputs($fp, $nbr_visit."\n");		// Sauvegarde du nouveau nombre
		fputs($fp, $date_start);		// Réécriture de la date
		fclose($fp);				// Fermeture du fichier
		
		$var_ip .= "\n".$REMOTE_ADDR."\t".date("d/m/Y H:i:s")."\n";
		
		$fp_cm = fopen($ip_file_cmpt, "w");
		fputs ($fp_cm, $var_ip);
		fclose($fp_cm);
		$nbr_connect++;
	}

	$retcmpt[0] = $date_start;
	$retcmpt[1] = $nbr_visit;
	$retcmpt[2] = $nbr_connect;
	
	return	$retcmpt;
}

ViPHP
ViPHP | 4039 Messages

28 sept. 2007, 13:32

 $fp = fopen($file_cmpt, "a+"); // Ouverture du fichier en Lecture / Ecriture 
C'est la que ça "pourrait" coincer. Ouvrir en a+ place le pointeur à la fin du fichier, et s'il n'existe pas il le crée. Donc si tu ouvres avec a+ pour lire les premières lignes (si le fichier existe) ça foire. je mettrais "r" à la place (lire, pointeur en début de fichier).

Mais le code n'est pas très clair, si tu pouvais l'éditer et le placer entre balises php (c'est prévu pour), il serait plus lisible.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 sept. 2007, 13:37

Modération :
gtony, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Eléphanteau du PHP | 26 Messages

28 sept. 2007, 13:54

Merci
j ai mis "r" et meme "r+" mais cela ne change rien
meme erreur

d0m
Mammouth du PHP | 1141 Messages

28 sept. 2007, 14:08

Comme te le dis l'erreur, la fonction mktime attend une valeur numérique comme paramètres.

Or les valeurs que tu lui passes sont des chaines de caractères car elles sont le résultat d'un explode sur une chaine de caractères.

Il les convertit mais pour éviter les erreurs, convertit les toi même avec la fonction intval par exemple.

Eléphanteau du PHP | 26 Messages

30 sept. 2007, 15:55

Merci mais je ne vois pas ou mettre la fonction "intval"
j ai essayer devant la valeur a affiche et la je ne vois que le nombre de visite
et devant "explode" erreur general de la ligne.

d0m
Mammouth du PHP | 1141 Messages

01 oct. 2007, 08:34

[...] devant "explode" erreur general de la ligne.
normal, intval fait la conversion d'une variable en entier. La fonction explode renvoie un tableau. On ne peut pas transtyper un tableau en un entier.

Il faut essayer de réflechir selon ton erreur :
l'erreur te dit que ma fonction mktime attends des valeurs numériques
=> tes paramètres ne sont pas des valeurs numériques
or tes paramètres sont : $heure, $minute, $seconde, $mois, $jour, $annee
en remontant là où ils sont créés tu remarques qu'ils sont le résultat d'un explode donc des chaines de caractères.
C'ets donc aux variables $heure, $minute, $seconde, $mois, $jour, $annee qu'il faut appliquer la fonction intval pour les transformer en entiers.

Eléphanteau du PHP | 26 Messages

01 oct. 2007, 10:42

J ai compris
ce qui me manquai c etait de comprendre l erreur

MERCI a tous

Mammouth du PHP | 19672 Messages

01 oct. 2007, 16:05

J'ai compris,
ce qui me manquait, c'était de comprendre l'erreur
:D Que j'aimerais donc voir plus souvent cette phrase chez pas mal de ceux qui postent dans ces forums :D
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: