es ce que c'est une faille (increment° de var trés louche) ?

Eléphant du PHP | 101 Messages

03 janv. 2006, 22:25

bonjour,
voila j'était entrain de faire un script pour faire un truc de cryptage de lien

jusqua ce que je tombre sur une reaction bizzar d'une de mes ligne sans le vouloire mais qui était la reaction exact que je chercher
voila je pose le petit bout de code
session_start(); // on demarre une session_start
@$a = $_SESSION['a']++; // on incrémente la variable $a de 1 a chaque fois
@$b = $_SESSION['b']++ - 1; // on incrémente la variable $b a chaque fois et en retire 1 ce qui devrai rien changer normalement
echo $a;
echo "<br>";
echo $b;
voila le souci dans la theori

on obtien ça normalement.

on commence 1er tour

$a++ vaut 0
$b++ - 1 vaut -1

2eme tour

$a++ vaut 0+1 = 1
$b++ - 1 vaut -1 + 1 = 0 - 1 = -1

3eme tour

$a++ vaut 1 + 1 = 2
$b++ - 1 vaut -1 + 1 = 0 - 1 = -1

ainsi de suite donc
on doit avoir ceci

a=0 b=-1
a=1 b=-1
a=2 b=-1
a=3 b=-1
a=4 b=-1
a=5 b=-1
a=6 b=-1
ect...

seulement voila ce que j'obtien dans la pratique quand je lance mon script

a=0 b=-1
a=1 b=0
a=2 b=1
a=3 b=2
a=4 b=3
a=5 b=4
a=6 b=5
a=7 b=6

c'est coméme bizzar

si quqlun a une explication ca m'aiderai bien a comprendre ou alors c'est moi qui na rien compri au math

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

03 janv. 2006, 22:48

Salut,

remplace ça :
@$b = $_SESSION['b']++ - 1;
par ça :
@$b = $_SESSION['b'] +1 - 1;
pour voir...

cela vient de l'utilisation de l'opérateur de post-incrémentation, regarde ici les différences :
http://fr2.php.net/manual/fr/language.o ... rement.php

Donc, sauf erreur de ma part, voici ce que fait ta ligne :
- renvoie $b=0, incrémente $b (qui vaut maintenant 1), soustrait 1 de $b renvoyée (donc affiche -1)
- renvoie $b=1, incrémente $b (qui vaut maintenant 2), soustrait 1 de $b renvoyée (donc affiche 0)
- renvoie $b=2, incrémente $b (qui vaut maintenant 3), soustrait 1 de $b renvoyée (donc affiche 1)
... ainsi de suite, alors qu'avec une opérattion normale cela fonctionne, puisque tout est fait à la suite (+1-1)

Eléphant du PHP | 101 Messages

03 janv. 2006, 23:06

j'ai fait ce que tu ma dit, oui ca ne donne pas la méme chose
j'avai essayer

mais c'est coméme bizzar je n'arive tjr pas a comprendre

que je fasse ++$b il ya pas de décalage en tre $a et $b
et si je fait $b++ il ya un décalage ver l'arriere.

je pense q'une bonne nuit de sommeil et laisser mon inconscient faire le travail a ma place ca vaudra mieu par ce que depuis ce matin
j'ai pas lacher mon poste et mes yeux sont enfflé.

a demain

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

03 janv. 2006, 23:31

que je fasse ++$b il ya pas de décalage en tre $a et $b
et si je fait $b++ il ya un décalage ver l'arriere.
cela tient simplement à la différence entre ces deux opérateurs :
comme expliqué dans la doc, ++$a incrémente $a et renvoie $a, $a++ renvoie $a puis l'incrémente (en arrière plan en quelque sorte)

Donc c'est tout à faire normal, avec ces 2 lignes :
$a = $_SESSION['a']++;
$d = ++$_SESSION['b'];
voici ce qui se passe :
- renvoie dans $a $_SESSION['a'], qui est vide, puis incrémente $_SESSION['a] qui vaut donc 0
- incrémente $_SESSION['b'], qui vaut donc 0, puis la renvoie dans $b

- renvoie dans $a $_SESSION['a'], qui vaut 0, puis incrémente $_SESSION['a] qui vaut donc 2
- incrémente $_SESSION['b'], qui vaut donc 1, puis la renvoie dans $b

Le décalage vient donc du fait que pour $a tu l'affiches avant incrémentation, alors que tu affiches $b après incrémentation.

Est-ce que c'est plus clair ?
Je reconnais que ça embrouille un peu parfois (d'ailleurs si j'ai dit une bêtise corrigez moi ;))

Invité
Invité n'ayant pas de compte PHPfrance

04 janv. 2006, 16:52

Merci pour tes explication

ca va j'ai compris méme si je suis un peut embrouiller


:)