Re: IsSet() and $_SESSION - BUG?

From: Date: Tue, 01 Jul 2003 04:46:22 +0000
Subject: Re: IsSet() and $_SESSION - BUG?
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-153512@lists.php.net to get a copy of this message
Hello everyone. I was able to determine what was causing my problem with session variables not being persitant across page requests. I want to give you the full scope here, so I'm going to paste the code (and if you have any code tips, please let me know). I think the problem might be this (and I don't know why it should be, but maybe you can help): If you look at file2.php, you will see that ValidAdminLogin() contains the "global $_SESSION;" declaration., but that's not the problem. ValidAdminLogin() calls a function ResetSessionVariables(), which also contains "global $_SESSION;". When "global $_SESSION;" is present in ResetSessionVariables(), it seems as though the $_SESSION variables are not being preserved across page requests (notice that ResetSessionVariables() is called BEFORE the variables are set with the real data, but it's really $_SESSION['uid'] we are concerned with.) When I remove "global $_SESSION;" from ResetSessionVariables(), all works fine across page request. Also note that $_SESSION['uid'] is set when we return from the file2.php function calls as noted in the "echo" command. So, why would a double global definintion negate $_SESSION? ------------------------------------ file1.php ------------------------- <?php session_start(); include "include/DatabaseConnect.php"; include "include/commonphp.php"; DisableClientCaching(); if (!isset($_SESSION['uid'])) { if ( !ValidAdminLogin($_POST['adminid'],$_POST['adminpass'])){ forceadminlogin(); } } elseif ( !ValidAdminSession() ){ // Not a valid admin session - redirect forceadminlogin(); } ?> <html> <body> <?php //We always get a value for this, but it get lost when we leave the page. echo $_SESSION['uid']; ?> <br><br><br><br> <center> <a href='additem.php'>Add Item</a> </center> </body> </html> --------------------------------------- file2.php -------------------------- <?php include "configvars.php"; function ValidAdminSession(){ global $_SESSION; if ( isset($_SESSION['adminlogin']) ){ return 1; } else { return 0;} } function DisableClientCaching(){
   header("Expires: "  . gmdate("D, d M Y H:i:s") .  " GMT");       // Expire now
   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  // always modified
   header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
   header("Cache-Control: post-check=0, pre-check=0", false);    // HTTP/1.0
   header("Pragma: no-cache");                                  // HTTP/1.0
} function ResetSessionVariables(){ // WHEN I REMOVE THIS LINE, EVERYTHING WORKS FINE // global $_SESSION; $_SESSION['uid'] = session_id(); $_SESSION['username'] = ''; $_SESSION['adminlogin'] = False; $_SESSION['fname'] = ''; $_SESSION['lname'] = ''; $_SESSION['email'] = ''; $_SESSION['errormesg'] = ''; } function ValidAdminLogin($user, $pass){ global $_SESSION; include "DatabaseConnect.php"; mysql_connect($DBAddress,$DBUser,$DBPassword); @mysql_select_db($DBDatabase) or die("ERROR"); $query="SELECT * FROM adminuser WHERE user='" . $user ."' AND pass='" . md5($pass) . "'"; $results = mysql_query($query); $num = mysql_numrows($results); if ($num != 1){
       $returnvar = false;  // Make sure the user exist, and is only one (even though it's a unique SQL field)
} else {
       ResetSessionVariables();
       $_SESSION['username'] = strtolower(formatformdata($user));
       $_SESSION['adminlogin'] = True;
       $_SESSION['fname'] = mysql_result($results,0,"fname");
       $_SESSION['lname'] = mysql_result($results,0,"lname");
       $_SESSION['email'] = mysql_result($results,0,"email");
       $_SESSION['uid'] = session_id();
       $returnvar = true;
} return $returnvar; mysql_close(); } function forceadminlogin(){
       ResetSessionVariables();
       header("Location: AdminLogin.php");
} function formatformdata($mystring){
       return addslashes(rawurldecode(chop($mystring)));   }
?> John Manko wrote:
I'm having a problem with the value that isset returns on $_SESSION variables. For some reason, even if $_SESSION['uid'] is set, isset returns FALSE. Here is the code: ------ file1.php ----------- include "file2.php"; if (!isset($_SESSION["uid"])) {
    // This first time $_SESSION["uid"] is check, we should
    // end up in here.  However, ValidAdminLogin (next test)
    // will set $_SESSION["uid"] so next time we will not
    // get here.       if ( !ValidAdminLogin($_POST["adminid"],$_POST["adminpass"]))
        forceadminlogin();
} elseif ( !ValidAdminSession() )
    forceadminlogin();
       
// this is done to show that $_SESSION["uid"] is being set // but isset still returns false echo $_SESSION["uid"]; ------ file2.php ----------- function ValidAdminLogin($user, $pass){
        global $_SESSION;
    if (The_MYSQL_Stuff_Is_NOT_OK)     return false;
    else
    {
         session_start();
      $_SESSION["logged"] = true;
      $_SESSION["username"] = $user;
      $_SESSION["adminlogin"] = true;
      $_SESSION["fname"] = $fname;
      $_SESSION["lname"] = $lname;
      $_SESSION["email"] = $email;
      $_SESSION["uid"] = session_id();
          return true;
    }
    mysql_close();              }


« previous php.general (#153512) next »