[PHP] problème boucle infini

Résolu/Fermé
boucleurfou - 26 janv. 2008 à 21:36
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 - 26 janv. 2008 à 23:09
Bonjour,
J'essaye de développer un script permettant d'afficher, dans un premier temps une version de ma page, et, si la page est rechargée afficher une autre version.

J'utilise pour cela l'ip du client:

$ip=$REMOTE_ADDR;
$ipok = 1;
$fileip = fopen('ip.txt', 'r');
while($ipok != 0 OR !feof($fileip))
{
if (fgets($fileip) == $ip) $ipok=0;
else $ipok=1;
}
fclose($fileip);
if($ipok)
{
echo "version 1";
$fileip = fopen('ip.txt', 'a');
fputs($fileip, "\n");
fputs($fileip, $ip);
fclose($fileip);
}
else echo "version 2";


Dans un premier temps je fais une boucle qui regarde si l'ip n'est pas stockée dans le fichier texte, si elle y est $ipok devient 0 et on sort de la boucle, si elle n'y est pas on descend jusqu'à la fin du fichier texte et on sort de la boucle.
Si la première version est affichée on ajoute l'IP du client à la fin du fichier texte.

Mon script plante et je ne comprends pas pourquoi, je pense qu'il fait une boucle infini car j'obtient une page totalement vide et dépourvu d'erreur alors que quelque soit la valeur de $ipok on affiche quelque chose.

Merci d'avance de votre aide,
Aurevoir.

6 réponses

Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 21:54
Bonsoir,
$ipok = 1;
$fileip = fopen('ip.txt', 'r');
while($ipok != 0 OR !feof($fileip))
Y'a qqch qui va pas là ...

$ipok = 1 => $ipok toujours != 0

donc tu tournes en rond ;o)
0
while($ipok != 0 OR !feof($fileip))
{
if (fgets($fileip) == $ip) $ipok=0;
else $ipok=1;
}

si la ligne du fichier correspond a l'ip alors $ipok = 0 ^^
et de toute façon grace a "OR !feof($fileip)" quand on arrive à la fin du fichier la boucle doit s'arréter... Normalement
Et c'est ça que je comprend pas!!!
please help me!
Merci d'avance,
Aurevoir.
0
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 22:17
oué chuis kc, verrai ça plus tard ;o)

C'est pourtant super simple :o(
0
Je crois vraiment que tu te trompes :S
$ipok n'est pas une constante et les instruction dans la boucle permettent de changer la valeur de $ipok donc la boucle peut avoir une fin.
la boucle ne remonte pas jusqu'à la définition de la variable $ipok=1; donc logiquement je pense que le problème ne vient pas d'ici.
Si tu penses vraiment (malgrès ma réponse) que tu as raison, peut tu m'aider à corriger mon script?
Merci d'avance!
0
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 22:28
oui j'ai bien compris, c mon boulot quand même le dev ;o)

>> je pense qu'il fait une boucle infini car j'obtient une page totalement vide et dépourvu d'erreur alors que quelque soit la valeur de $ipok on affiche quelque chose

Insère des tests pour voir où ça coince ...
0
J'ai inséré des tests ^^ mais rien ne s'affiche T-T
j'ai essayer plusieurs fois de mettre des echo mais la page reste toujours totalement blanche c'est ça que je comprend pas
Merci beaucoup de ton aide, mais le problème demeure :p
PS:j'ai le droit de poster mon lien ici pour que tu puisses jeter un coup d'oeil?
0
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 22:34
tu as le droit mais ça ne sert à rien.

Faudrait que je le teste en local ton script mais g pas le temps là pis chuis vraiment hs ^^

EDIT: mets des tests partout:
$ip=$REMOTE_ADDR; echo "IP = $ip";
$ipok = 1;
$fileip = fopen('ip.txt', 'r');

echo "Je suis avant le while";

while($ipok != 0 OR !feof($fileip))
{
  $getIp = fgets($fileip);
  if ($getIp == $ip) {$ipok=0; print_r($getIp); echo "ipok est à zero";}
  else {$ipok=1; echo "ipok est à 1";}
}
fclose($fileip);

echo "Je suis après le while";

if($ipok)
{
  echo "version 1";
  $fileip = fopen('ip.txt', 'a');
  fputs($fileip, "\n");
  fputs($fileip, $ip);
  fclose($fileip);
}
else echo "version 2";
Si RIEN n'apparaît, le pb est ailleurs ...

Tiens-moi au courant ! ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai mit la boucle en commentaire et la page marche bien,
j'ai aussi fait tes tests:

ET J'AI TROUVER LE PROBLèME!

et finalement,en quelque sorte, c'est moi qui avais raison :p
le problème ne venait pas de $ipok
mais de la définition de la boucle:
il fallait écrire: while($ipok != 0 AND !feof($fileip))
au lieu de : while($ipok != 0 OR !feof($fileip))
ta solution n'était pas bonne :p mais tu ma poussé à chercher.
je n'y serais pas arrivé sans toi alors merci beaucoup!!!!!
Aurevoir.
et encore merci!
0
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 23:06
lol forcément tu avais raison pisque g sorti une grosse connerie au début ! Pis j'ai apporté zéro soluce dans ma première réponse, je l'ai compris juste après avoir validé le message ... on fait tous des erreurs hein.

Et oui, quand ça marche pas et qu'on comprend pas pourquoi, faut mettre des tests partout et l'erreur saute aux yeux ^^

J'y avais pensé au && en plus :o) Mais je me suis pas vraiment plongée dans ton code, chuis vraiment pas en état là .

Bref, tant mieux si ça fonctionne ;o)

Bonne prog !!
0
dit moi :S
comment on met le sujet en "résolu"? je trouve pas xD


(La honte quand même, se planter sur une boucle pendant 2h30.... *Va réviser ses cours de php...* xD)
0
Pi_Xi Messages postés 2244 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 22 janvier 2016 149
26 janv. 2008 à 23:09
T'en verras d'ot, ça arrive à tout le monde, même aux meilleurs de galérer qq heures sur des conneries ;o) Surtout après qq longues heures de prog intensive.

Le statut résolu, chais pu, ça m'a toujours semblé évident de basculer le statut du sujet ^^

Ptet quand tu édite une réponse, tu as moyen de mettre résolu.
0