|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2003-02-07 17:41 UTC] phpbugs at brianmertens dot com
It took me a while to track this down...
we noticed that when we upgraded a develpment box
from 4.2.3 to 4.3.0, that one of our session vars
was being over-written by another.
It turns out that one was being serialized
to the session as a reference to the other,
but only if the vars were intialized like this:
$var1 = $var2 = "some value";
Consider two scripts, test_bug1.php and test_bug2.php
If you run test_bug1, and then test_bug2, surprisingly,
the output of test_bug2 will be:
BEFORE:
var1 = 'INITIALIZED'
var2 = 'INITIALIZED'
AFTER:
var1 = 'CHANGED'
var2 = 'CHANGED'
<?php
// test_bug1.php
session_start();
$var1 = $var2 = "INITIALIZED";
session_register("var1","var2");
echo "INIT:<br>\n";
echo "var1 = '$var1'<br>";
echo "var2 = '$var2'<br><p>";
echo "<a href='test_bug2.php'>test_bug2.php</a>";
?>
<?php
// test_bug2.php
session_start();
echo "BEFORE:<br>\n";
echo "var1 = '$var1'<br>\n";
echo "var2 = '$var2'<br><p>\n";
$var2 = "CHANGED";
echo "AFTER:<br>\n";
echo "var1 = '$var1'<br>\n";
echo "var2 = '$var2'<br><p>\n";
$var2 = "EXIT";
?>
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 04:00:01 2025 UTC |
Actually, I have created a simpler test case, which produces the behaviour in one script, and BEFORE serialization: <?php // bug3.php session_start(); $var1 = $var2 = "INITIALIZED"; session_register("var1","var2"); $var2 = "CHANGED"; echo $var1."<br>"; echo $var2."<br>"; ?> Actual Output in 4.3.0: CHANGED CHANGED Session data after execution var1|s:7:"CHANGED";var2|R:1; So it seems that $var2 is a reference of $var1, but only if the session_start and session_register functions are called. Notes: The bug occurs even if the "session_start();" and the "$var1 = $var2 = "INITIALIZED";" lines are swapped. The buggy behaviour disappears if I move the line "$var2 = "CHANGED"" above the session_register() call.A colleague points out that this script also produces the buggy behaviour. <?php session_start(); $var1 = "INITIALIZED"; $var2 = $var1; session_register("var1","var2"); $var2 = "CHANGED"; echo $var1."<br>"; echo $var2."<br>"; ?>Just FYI, the following script works as expected: <?php session_start(); if (!isset($_SESSION['var1'])) { $_SESSION['var1'] = "INITIALIZED"; $_SESSION['var2'] = $_SESSION['var1']; $_SESSION['var2'] = "CHANGED"; } var_dump($_SESSION); ?>