Posez votre question Signaler

[PHP] problème boucle infini [Résolu]

boucleurfou - Dernière réponse le 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.
Lire la suite 

[PHP] problème boucle infini »

11 réponses
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
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.
Pi_Xi- 26 janv. 2008 à 22:17
oué chuis kc, verrai ça plus tard ;o)

C'est pourtant super simple :o(
Ajouter un commentaire
Réponse
+0
moins plus
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!
Pi_Xi- 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 ...
Ajouter un commentaire
Réponse
+0
moins plus
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?
Pi_Xi- 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 ! ^^
Ajouter un commentaire
Réponse
+0
moins plus
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!
Pi_Xi- 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 !!
Ajouter un commentaire
Réponse
+0
moins plus
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)
Pi_Xi- 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.
Ajouter un commentaire
Ce document intitulé « [PHP] problème boucle infini » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?