php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #9207 User session handler doesn't call write function
Submitted: 2001-02-10 16:01 UTC Modified: 2001-03-01 21:42 UTC
From: jensenta2001 at yahoo dot com Assigned:
Status: Not a bug Package: Session related
PHP Version: 4.0.4pl1 OS: RH Linux 6.2 on Sparc
Private report: No CVE-ID: None
 [2001-02-10 16:01 UTC] jensenta2001 at yahoo dot com
I'm trying to setup a user session module using a postgre (6.2.3) database.  the script that I'm supplying defines the functions for storing session data.  If I force the session data into the database the read function works and I can retrieve the session data.  However, the write function never gets called so data is never stored in the database.  This is simular to problems reported in #8772 and #9002. There is a difference though.  Those reports indicate that register_globals was off.  In my case register_globals was on.  Here is the script I'm using to test the session module.

============================================
<?php

$sess_pg = array();
$sess_pg["open_connection"] = true;           // Establish a Pg connection on session startup?
$sess_pg["hostname"]        = "localhost";    // Pg hostname
$sess_pg["port"]            = "5432";         // Pg port
$sess_pg["db"]              = "php_sessions"; // Database where to store the sessions
$sess_pg["table"]           = "sessions";     // Table where to store the sessions

function sess_pg_open($save_path, $sess_name)
{
    global $sess_pg;

    // Establish a Pg connection, if $sess_pg["open_connection"] is true
    if ($sess_pg["open_connection"])
    {
        $sess_pg["connection"] = pg_pconnect( $sess_pg["hostname"], 
					      $sess_pg["port"], 
					      $sess_pg["db"]) or die(pg_errormessage($sess_pg["connection"]));
    }

    return(true);
}

function sess_pg_read($sess_id)
{
    global $sess_pg;

	echo "HELP ME<br>";
	$query  = "SELECT data ";
	$query .= "FROM ".$sess_pg["table"]." ";
	$query .= "WHERE id = '$sess_id'";
	echo "$query<BR>";

    // Select the data belonging to session $sess_id from the Pg session table    
    $result = pg_exec($sess_pg["connection"], $query) or die(pg_errormessage($sess_pg["connection"])) or die(pg_errormessage($sess_pg["connection"]));
    # 

    // Return an empty string if no data was found for this session
    //if(pg_numrows($result) == 0)
    if(!($sess_pg["present"] = pg_numrows($result)))
    {
	echo "Nothing<BR>";
        return("");
    }

    echo "Records: ".$sess_pg["present"]."<BR>";

    // Session data was found, so fetch and return it
    $row_number	= 0;
    $row = pg_fetch_array($result,$row_number);
    pg_freeresult($result);

    echo "DATA: ".$row["data"]."<BR>";

    return($row["data"]);
}

function sess_pg_write($sess_id, $val)
{
    global $sess_pg;

    if(!$sess_pg["present"]){
        // Write the serialized session data ($val) to the Pg ession table
	$query  = "INSERT INTO ". $sess_pg["table"] ." (id, data, t_stamp) ";
	$query .= "VALUES ($sess_id, $val, now())";
	$result = pg_exec($sess_pg["connection"], $query) or die(pg_errormessage($sess_pg["connection"]));
    }else{	
	// Write the serialized session data ($val) to the Pg ession table
	$query  ="UPDATE ".$sess_pg["table"];
	$query .=" SET data = '$val', t_stamp = now() ";
	$query .=" where id = '$sess_id'";
	$result = pg_exec($sess_pg["connection"], $query) or die(pg_errormessage($sess_pg["connection"]));
    }    
    return(true);    
}

function sess_pg_destroy($sess_id)
{
    global $sess_pg;

    // Delete from the Pg table all data for the session $sess_id
    $query  ="DELETE FROM ".$sess_pg["table"]." ";
    $query .="WHERE id = '$sess_id' ";
    $result = pg_db_query($sess_pg["connection"], $query) or die(pg_errormessage($sess_pg["connection"]));
        
    return(true);    
}

function sess_pg_gc($max_lifetime)
{
    global $sess_pg;

    // Old values are values with a Unix less than now - $max_lifetime
    $old = time() - $max_lifetime;

    // Delete old values from the Pg session table
    $result = pg_db_query($sess_pg["connection"], "DELETE FROM ".$sess_pg["table"]." WHERE UNIX_TIMESTAMP(t_stamp) < $old") or die(pg_errormessage($sess_pg["connection"]));
        
    return(true);    
}


$foo = 10;    
session_set_save_handler("sess_pg_open", "", "sess_pg_read", "sess_pg_write", "sess_pg_destroy", "sess_pg_gc");
session_start();
session_register("foo");
echo "foo: $foo";
$foo++; 
?>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-02-20 13:47 UTC] sas@php.net
How did you verify that the write handler is not called? Note that during the request shutdown the write/close handlers cannot send any data to the browser.
 [2001-02-28 23:51 UTC] jensenta2001 at yahoo dot com
Sorry for the inconvience the problem was in my code.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Dec 22 06:01:30 2024 UTC