Rechercher : dans
Par :

[PHP] problème boucle infini

Dernière réponse le 26 jan 2008 à 23:09:04 boucleurfou, le 26 jan 2008 à 21:36:39 
 Signaler ce message aux modérateurs

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.

Meilleures réponses pour « [PHP] problème boucle infini » dans :
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...
Langage C++ - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...

1

Pi_Xi, le 26 jan 2008 à 21:54:06

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) A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi

2

boucleurfou, le 26 jan 2008 à 22:06:20

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.

Répondre à boucleurfou

3

Pi_Xi, le 26 jan 2008 à 22:17:28

Oué chuis kc, verrai ça plus tard ;o)

C'est pourtant super simple :o( A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi

4

boucleurfou, le 26 jan 2008 à 22:24:10

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!

Répondre à boucleurfou

5

Pi_Xi, le 26 jan 2008 à 22:28:24

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 ... A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi

6

boucleurfou, le 26 jan 2008 à 22:32:22

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?

Répondre à boucleurfou

7

Pi_Xi, le 26 jan 2008 à 22:34:30

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 ! ^^ A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi

8

boucleurfou, le 26 jan 2008 à 23:01:24

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!

Répondre à boucleurfou

10

Pi_Xi, le 26 jan 2008 à 23:06:58

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 !! A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi

9

boucleurfou, le 26 jan 2008 à 23:06:40

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)

Répondre à boucleurfou

11

 Pi_Xi, le 26 jan 2008 à 23:09:04

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. A chaque problème sa solution, à chaque posteur son sujet... merci ^^

La b-a-ba de la protection: OS, navigateurs, AV + pare-feu à jour !

Répondre à Pi_Xi
Collection CommentÇaMarche.net