boucles et assignations de variables

soak
Invité n'ayant pas de compte PHPfrance

26 oct. 2007, 14:45

Bonjour à tous,

Je viens vous soumettre un petit probleme :

une boucle que je n'arrive pas à resoudre. Apparament je ne dois pas utiliser la bonne boucle ou il doit manquer quelquechose dans celle-ci.

mon code :
<?php

//si le fichier exist l'ouvrir en ecriture pour ecrire a la suite sinon le creer
if (file_exists("temp.txt")) {
	$fp = fopen("temp.txt","a");
} else {
	touch("temp.txt");
}


$fichier_temp = file("temp.txt");
// recuperation de la date au format 220719801141 Jour Mois Annees heures min
$today = date('dmYGi'); 
// recuperation de l'adresse IP
$client = $_SERVER["REMOTE_ADDR"];
//affichage des 2 var
//echo "$today $client";

//var regroupant nos deux var (client et date) avec espace
$var_tot = $today." ".$client."\n";

//ecriture dans fichier
fputs($fp,$var_tot);
fclose($fp);

//lecture du fichier
$fp = fopen("temp.txt", 'r');
$total = count($fp);

while (!feof($fp)) {
	$rec = fgets($fp,50);
	$liste = explode (" ",$rec);
	$time = $liste[0];
	$ip = $liste[1];
	echo "date: $time &nbsp; ip: $ip<br />";
}

//fermerture fichier
fclose($fp);

?>


Et pour etre plus clair je vous affiche la boucle qui me pose probleme :
while (!feof($fp)) {
	$rec = fgets($fp,50);
	$liste = explode (" ",$rec);
	$time = $liste[0];
	$ip = $liste[1];
	echo "date: $time &nbsp; ip: $ip<br />";
}
je vous joinds egalement l'affichage avec l'erreur :

Code : Tout sélectionner

date: 261020071526 ip: 127.0.0.1 date: 261020071526 ip: 127.0.0.1 date: 261020071526 ip: 127.0.0.1 date: 261020071528 ip: 127.0.0.1 date: 261020071528 ip: 127.0.0.1 date: 261020071529 ip: 127.0.0.1 date: 261020071529 ip: 127.0.0.1 date: 261020071531 ip: 127.0.0.1 Notice: Undefined offset: 1 in f:\web_site\lab\index.php on line 36 date: ip:
Comme on peut le voir la boucle fait bien son travail, les donnees sont bien recuperees et affichees comme souhaitees.
Cependant le petit problème est le notice à la fin. Pour moi, en fin ou en début de boucle les variables ip et time sont vide.

J'espere que tout cela est clair et pas trop brouillon.

En vous remerciant d'avance

Ps: ce script n'est pas finit, celui-ci me servira pour faire un compteur live.

++

Soak

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

26 oct. 2007, 14:55

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

J'édite ton message pour cette fois, mais que ça ne se reproduise plus où je te vole dans les plumes ;)

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


Edit : t'aurais pas tout simplement une ligne vide à la fin de ton fichier ?

Edit bis : bon ben en fait, tu as bien une ligne vide à la fin de ton fichier puisque chaque ligne insérée se termine par un retour charriot. Du coup, lorsque tu parcours le fichier ligne par ligne et que tu arrives sur la dernière, elle ne contient pas de données et le explode ne fonctionne pas.

Il te faut donc tester avant de faire l'explode que la ligne n'est pas vide :)
Modifié en dernier par Ryle le 26 oct. 2007, 15:00, modifié 1 fois.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

26 oct. 2007, 14:59

Merci de ton attention Ryle :)
JE ferais plus attention la prochaine fois promis.

Si je pense aussi que l'on me gratifie d'un NOTICE à cause de ça, mais je n'arrive pas à le résoudre.
J'ai besoin d'un apport spirituel de mes ainés pour me dépatouiller.

++

soak[/b]
Modifié en dernier par soak le 26 oct. 2007, 15:02, modifié 1 fois.

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

26 oct. 2007, 15:01

J'ai édité mon message mais n'ait pas été assez rapide, je ne sais donc pas si tu as vu mon complément par rapport à ton problème :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

d0m
Mammouth du PHP | 1141 Messages

26 oct. 2007, 15:03

Tout d'abord pense à indiquer la ligne de ton erreur, ligne 36 ok mais nous on a pas tes numéros de ligne. Ici c'est pas très grave, on voit d'où vient l'erreur.
Notice: Undefined offset: 1
c'est à dire que tu essaie d'accéder au l'élement d'indice 1 d'un tableau alors que celui ci n'existe pas.

l'erreur survient dans cette ligne :
$ip = $liste[1];
et $liste est l'explosion de $rec

on en déduit donc que ta dernière ligne traitée dans le fichier n'a pas de séparateur.
Ca doit être une ligne vide ou un mot seul.

Petit nouveau ! | 8 Messages

26 oct. 2007, 15:13

Entierement d'accord avec toi d0m.

Le truc c'est que quand la boucle arrive en fin de fichier, il me fait encore un passage et forcément la ligne est vide, donc il m'affiche ce NOTICE. Est-ce que mon raisonement est bon pour le moment?

Si c'est bon, comment lui faire comprendre que c'est la fin du fichier et que si c'est vide il n'a pas besoin d'afficher?

En ecrivant cette petite phrase au dessus, est-ce qu'une condition if peut etre valable pour résoudre?

d0m
Mammouth du PHP | 1141 Messages

26 oct. 2007, 15:19

tu peux soit enlever ta ligne vide, soit comme tu le dis faire un petit test.
Tu peux le faire à plusieurs niveaux:
while (!feof($fp)) {
    $rec = fgets($fp,50);
    if(!empty(trim($rec))){//vérification si la ligne n'est pas vide
      $liste = explode (" ",$rec);
      if(isset($liste[1])){//vérification que l'explosion a bien fait au moins 2 chaines
        $time = $liste[0];
        $ip = $liste[1];
        echo 'date: '.$time.'&nbsp; ip: '.$ip.'<br />';
      }
    }
}

Petit nouveau ! | 8 Messages

26 oct. 2007, 16:27

Merci a vous tous :)

Le probleme est resolut, voici le code corrigé :
while (!feof($fp)) {
	$rec = fgets($fp,50);
	if (empty($rec)) {
	break;
	} else {
	$liste = explode (" ",$rec);
	$time = $liste[0];
	$ip = $liste[1];
	echo "date: $time &nbsp; ip: $ip<br />";
	}
}

Je pense donc que ma question est resolue, comment faire pour l'indiquer dans le sujet?

Soak

d0m
Mammouth du PHP | 1141 Messages

26 oct. 2007, 16:28

Je pense donc que ma question est resolue, comment faire pour l'indiquer dans le sujet?
Tu édites ton premier message et tu cliques sur le bouton Résolu

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

26 oct. 2007, 16:36

Le premier message était posté en tant qu'invité, il ne peut donc pas l'éditer ou mettre de [Résolu].

Je l'ai donc ajouté pour lui :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...