Voici un code tout bête:
print_r($_SESSION);
$temp=$_SESSION;
unset($temp["user"]["oCompte"]);
print_r($_SESSION);
dans l'objet session, j'ai un accés à ["user"]["oCompte"].
Le premier print_r me montre bien l'existence de ce champs.
Le deuxième print_r montre pourtant qu'il disparait apres le unset!!!
Pourquoi est-ce que le unset du tableau $temp affecte aussi $_session sur
linux (sur windows ca marche bien).
Apparement l'affectation du tableau est faite par référence dans le cas de
mon environnement sur linux.
Quel est le flag du php.ini qui peut empecher ce problème (car je me doute
bien que c'est plus un probleme de config que d'environnement)?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
php 4.3.10 sur windows et le même sur linux
[...]
dans l'objet session, j'ai un accés à ["user"]["oCompte"]. Le premier print_r me montre bien l'existence de ce champs. Le deuxième print_r montre pourtant qu'il disparait apres le unset!!! Pourquoi est-ce que le unset du tableau $temp affecte aussi $_session sur linux (sur windows ca marche bien).
Ce n'est pas un unset d'un élément de $temp qui affecte $_SESSION, mais un unset d'un élément de $temp["user"] (celui d'index "oCompte") qui affecte $_SESSION["user"]. Je suppose que c'est pour des besoins de performances, ou tout simplement par flemme des développeurs, que la copie de tableaux imbriqués ne copie que le premier niveau, le reste étant passé par référence.
Il serait intéressant de voir ce qui se passe si dans un sous-tableau tu mets une référence vers le tableau de premier niveau, et que tu en fais une copie. Du moins, c'est sur Windows que cela doit être rigolo : il pourrait bien rentrer dans une boucle infinie.
Tiens, au fait tu n'es pas le seul à l'avoir remarqué :
<cit. http://www.php.net/manual/fr/language.types.array.php> db 05-Jan-2005 10:06 --------------------------------------------------------- Attention with Arrays in Arrays!
If you copy (=) an array which contains arrays it will be EFERENCED not COPIED. </cit.>
Apparement l'affectation du tableau est faite par référence dans le cas de mon environnement sur linux.
... l'affectation des sous-tableaux dans le cas multidimensionnel.
Quel est le flag du php.ini qui peut empecher ce problème (car je me doute bien que c'est plus un probleme de config que d'environnement)?
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour Unix n'ont pas fait une boucle récursive pour copier les tableaux de tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse la rétablir.
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.
php 4.3.10 sur windows et le même sur linux
[...]
dans l'objet session, j'ai un accés à ["user"]["oCompte"].
Le premier print_r me montre bien l'existence de ce champs.
Le deuxième print_r montre pourtant qu'il disparait apres le unset!!!
Pourquoi est-ce que le unset du tableau $temp affecte aussi $_session sur
linux (sur windows ca marche bien).
Ce n'est pas un unset d'un élément de $temp qui affecte $_SESSION, mais
un unset d'un élément de $temp["user"] (celui d'index "oCompte") qui
affecte $_SESSION["user"]. Je suppose que c'est pour des besoins de
performances, ou tout simplement par flemme des développeurs, que la
copie de tableaux imbriqués ne copie que le premier niveau, le reste
étant passé par référence.
Il serait intéressant de voir ce qui se passe si dans un sous-tableau tu
mets une référence vers le tableau de premier niveau, et que tu en fais
une copie. Du moins, c'est sur Windows que cela doit être rigolo : il
pourrait bien rentrer dans une boucle infinie.
Tiens, au fait tu n'es pas le seul à l'avoir remarqué :
<cit. http://www.php.net/manual/fr/language.types.array.php>
db 05-Jan-2005 10:06
---------------------------------------------------------
Attention with Arrays in Arrays!
If you copy (=) an array which contains arrays it will be
EFERENCED not COPIED.
</cit.>
Apparement l'affectation du tableau est faite par référence dans le cas de
mon environnement sur linux.
... l'affectation des sous-tableaux dans le cas multidimensionnel.
Quel est le flag du php.ini qui peut empecher ce problème (car je me doute
bien que c'est plus un probleme de config que d'environnement)?
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour
Unix n'ont pas fait une boucle récursive pour copier les tableaux de
tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse
la rétablir.
--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.
dans l'objet session, j'ai un accés à ["user"]["oCompte"]. Le premier print_r me montre bien l'existence de ce champs. Le deuxième print_r montre pourtant qu'il disparait apres le unset!!! Pourquoi est-ce que le unset du tableau $temp affecte aussi $_session sur linux (sur windows ca marche bien).
Ce n'est pas un unset d'un élément de $temp qui affecte $_SESSION, mais un unset d'un élément de $temp["user"] (celui d'index "oCompte") qui affecte $_SESSION["user"]. Je suppose que c'est pour des besoins de performances, ou tout simplement par flemme des développeurs, que la copie de tableaux imbriqués ne copie que le premier niveau, le reste étant passé par référence.
Il serait intéressant de voir ce qui se passe si dans un sous-tableau tu mets une référence vers le tableau de premier niveau, et que tu en fais une copie. Du moins, c'est sur Windows que cela doit être rigolo : il pourrait bien rentrer dans une boucle infinie.
Tiens, au fait tu n'es pas le seul à l'avoir remarqué :
<cit. http://www.php.net/manual/fr/language.types.array.php> db 05-Jan-2005 10:06 --------------------------------------------------------- Attention with Arrays in Arrays!
If you copy (=) an array which contains arrays it will be EFERENCED not COPIED. </cit.>
Apparement l'affectation du tableau est faite par référence dans le cas de mon environnement sur linux.
... l'affectation des sous-tableaux dans le cas multidimensionnel.
Quel est le flag du php.ini qui peut empecher ce problème (car je me doute bien que c'est plus un probleme de config que d'environnement)?
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour Unix n'ont pas fait une boucle récursive pour copier les tableaux de tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse la rétablir.
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.
WebRod
En fait c'est pas tout à fait ca!
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux). Par exemple: $a["row1"]=array("row1.1"=>"row1.1.1" , "row1.2"=>"row1.2.1"); $a["row2"] = array("row2.1"=>"row2.1.1", "row2.2"=>"row2.2.1"); print_r($a); $temp=$a; unset ($temp["row2"]["row2.1"]); print_r($temp); print_r($a);
Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en debut de code), alors la on retourne dans mon premier message, et donc le tableau $_SESSION est affecté par le unset!!!
bizarre.....bizarre!!!
Rod
En fait c'est pas tout à fait ca!
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux).
Par exemple:
$a["row1"]=array("row1.1"=>"row1.1.1"
, "row1.2"=>"row1.2.1");
$a["row2"] = array("row2.1"=>"row2.1.1",
"row2.2"=>"row2.2.1");
print_r($a);
$temp=$a;
unset ($temp["row2"]["row2.1"]);
print_r($temp);
print_r($a);
Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en
debut de code), alors la on retourne dans mon premier message, et donc le
tableau $_SESSION est affecté par le unset!!!
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux). Par exemple: $a["row1"]=array("row1.1"=>"row1.1.1" , "row1.2"=>"row1.2.1"); $a["row2"] = array("row2.1"=>"row2.1.1", "row2.2"=>"row2.2.1"); print_r($a); $temp=$a; unset ($temp["row2"]["row2.1"]); print_r($temp); print_r($a);
Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en debut de code), alors la on retourne dans mon premier message, et donc le tableau $_SESSION est affecté par le unset!!!
bizarre.....bizarre!!!
Rod
WebRod
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour Unix n'ont pas fait une boucle récursive pour copier les tableaux de tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse la rétablir.
merci pour ces infos. C'est tout de même incroyable que le cahier des charges ne soient pas le même sous unix et sous windows!! On dit que php est portable sur les 2 environnements la preuve que non!! grrr, ca m'énerve ce genre de trucs!!!
Bon, j'ai cherché une belle fonction arra_copy ou un truc de ce genre mais ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Si y en a pas je me lancerais dedans 1 de ces 4 mais si je peux éviter de réinventer la roue, d'autres ont surement dû le faire et éprouver de longs tests avant moi.
Rien trouvé sur le net
Rod
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour
Unix n'ont pas fait une boucle récursive pour copier les tableaux de
tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse
la rétablir.
merci pour ces infos.
C'est tout de même incroyable que le cahier des charges ne soient pas le
même sous unix et sous windows!!
On dit que php est portable sur les 2 environnements la preuve que non!!
grrr, ca m'énerve ce genre de trucs!!!
Bon, j'ai cherché une belle fonction arra_copy ou un truc de ce genre mais
ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Si y en a pas je me lancerais dedans 1 de ces 4 mais si je peux éviter de
réinventer la roue, d'autres ont surement dû le faire et éprouver de longs
tests avant moi.
Je te trouve bien optimiste sur ce coup là. Si les développeurs pour Unix n'ont pas fait une boucle récursive pour copier les tableaux de tableaux de tableaux, je ne suis pas sûr qu'un flag dans php.ini puisse la rétablir.
merci pour ces infos. C'est tout de même incroyable que le cahier des charges ne soient pas le même sous unix et sous windows!! On dit que php est portable sur les 2 environnements la preuve que non!! grrr, ca m'énerve ce genre de trucs!!!
Bon, j'ai cherché une belle fonction arra_copy ou un truc de ce genre mais ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Si y en a pas je me lancerais dedans 1 de ces 4 mais si je peux éviter de réinventer la roue, d'autres ont surement dû le faire et éprouver de longs tests avant moi.
Rien trouvé sur le net
Rod
Olivier Miakinen
C'est tout de même incroyable que le cahier des charges ne soient pas le même sous unix et sous windows!!
Eh oui. J'ai souvent remarqué (et regretté) que la doc soit si peu explicite pour un grand nombre de comportements.
Bon, j'ai cherché une belle fonction array_copy ou un truc de ce genre mais ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Non, je n'en connais pas, mais je pense comme toi que cela a peut-être été fait par d'autres. Note que dans ton cas particulier tu n'as pas besoin d'une récursivité complète : il te suffit de copier un sous-niveau.
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.
C'est tout de même incroyable que le cahier des charges ne soient pas le
même sous unix et sous windows!!
Eh oui. J'ai souvent remarqué (et regretté) que la doc soit si peu
explicite pour un grand nombre de comportements.
Bon, j'ai cherché une belle fonction array_copy ou un truc de ce genre mais
ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Non, je n'en connais pas, mais je pense comme toi que cela a peut-être
été fait par d'autres. Note que dans ton cas particulier tu n'as pas
besoin d'une récursivité complète : il te suffit de copier un sous-niveau.
--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.
C'est tout de même incroyable que le cahier des charges ne soient pas le même sous unix et sous windows!!
Eh oui. J'ai souvent remarqué (et regretté) que la doc soit si peu explicite pour un grand nombre de comportements.
Bon, j'ai cherché une belle fonction array_copy ou un truc de ce genre mais ca n'existe pas, connais-tu une fonction qui fasse une copie récursive??
Non, je n'en connais pas, mais je pense comme toi que cela a peut-être été fait par d'autres. Note que dans ton cas particulier tu n'as pas besoin d'une récursivité complète : il te suffit de copier un sous-niveau.
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.
Olivier Miakinen
En fait c'est pas tout à fait ca!
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux). [exemple] Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en debut de code), alors la on retourne dans mon premier message, et donc le tableau $_SESSION est affecté par le unset!!!
bizarre.....bizarre!!!
Il y a peut-être moyen d'envoyer un rapport de bug quelque part ?
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.
En fait c'est pas tout à fait ca!
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux).
[exemple]
Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en
debut de code), alors la on retourne dans mon premier message, et donc le
tableau $_SESSION est affecté par le unset!!!
bizarre.....bizarre!!!
Il y a peut-être moyen d'envoyer un rapport de bug quelque part ?
--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.
Le problème ne se pose qu'avec $_SESSION (et ce genre de tableaux). [exemple] Et bien $a n'est pas modifié sur linux!!
Par contre si je remplace $a par $_SESSION (avec même un unset ($_SESSION en debut de code), alors la on retourne dans mon premier message, et donc le tableau $_SESSION est affecté par le unset!!!
bizarre.....bizarre!!!
Il y a peut-être moyen d'envoyer un rapport de bug quelque part ?
-- Olivier Miakinen Non, monsieur le juge, je vous le jure : jamais je n'ai cité Bruxelles dans ma signature.