Jump to content

session_set_save_handler to postgresql


zenlord

Recommended Posts

Hi,

 

You probably know where I am right now: after reading and coding for about an hour, you are happy with the solution you've come up with and that is working 'so-and-so', and then you do some more reading and coding only to find that suddenly everything stops working. At this moment, my db-session-class doesn't do *zilch* anymore.

 

Could someone please look through the code and point me at something probably to stupid to mention?

 

<?php

class Session {

/* Required this Postgresql table:
* 
CREATE TABLE session (
	sessionid CHAR(32) NOT NULL,
	expiration INT NOT NULL,
	value TEXT NOT NULL,
	CONSTRAINT session_pk PRIMARY KEY(sessionid)
);
*/

public $sess_id;
public $sess_data;
public $sess_name;
public $sess_life;
public $sess_exp;
private $_conn;


/* open()
* Opens a persistent server connection and selects the database.
*/
function open($sess_path, $sess_name) {

	if (! session_set_save_handler(
		array(&$this,'open'),
		array(&$this,'close'),
		array(&$this,'read'),
		array(&$this,'write'),
		array(&$this,'destroy'),
		array(&$this,'garbage_collect')
		)) { die('session_set_save_handler() failed'); }

	$this->sess_life = 18000;

	$this->_conn = @ pg_connect("host=localhost dbname=<snip> user=<snip> password=<snip>");

} // end function open()


/* close()
* Doesn't actually do anything since the server connection is
* persistent. Keep in mind that although this function
* doesn't do anything in this particular implementation, it
* must nonetheless be defined.
*/
function close() {

	// Allegedly needed to write everything to db before closing
	// the object.
	session_write_close();

	// On Debian and Ubuntu, garbage collection is not immediately
	// handled, so we call it here ourselves, just to make sure.
	$this->garbage_collect($this->sess_life);

	//pg_close($this->_conn);
	return 1;
} // end function close()


/* read()
* Reads the session data from the database
*/
function read($sess_id) {

	$query = "SELECT value FROM session WHERE sessionid ='$sess_id' AND expiration > " . time();
	$result = pg_query($this->_conn, $query);
	if (pg_num_rows($result)) {
		$row = pg_fetch_assoc($result);
		$value = $row['value'];
		return $value;
	} else {
		return "";
	}
} // end function select()


/* write()
* This function writes the session data to the database.
* If that sessionid already exists, then the existing data will be updated.
*/
function write($sess_id, $sess_data) {

	$expiration	= time() + $this->sess_life;

	$query = "INSERT INTO session VALUES('$sess_id', $expiration, '$sess_data')";
	$result = pg_query($this->_conn, $query);

	if (! $result) {
		$query = "UPDATE session SET expiration = $expiration, value = '$sess_data'
					WHERE sessionid = '$sess_id' AND expiration >". time();
		$result = pg_query($this->_conn, $query);
	}
} // end function write()


/* destroy()
* Deletes all session information having input sessionid (only one row)
*/
function destroy($sess_id) {

	$query = "DELETE FROM session WHERE sessionid = '$sess_id'";
	$result = pg_query($this->_conn, $query);
} // end function destroy()


/* garbage_collect()
* Deletes all sessions that have expired.
*/
function garbage_collect($lifetime) {

	$lifetime = $this->sess_life;
	$old = time() - $lifetime;

	$query = "DELETE FROM session WHERE expiration < $old";
	$result = pg_query($this->_conn, $query);
	return pg_affected_rows($result);
} // end function garbage_collect()

}

?>

(I have been tinkering with that piece of code for more than 2 hours now, and I don't get any errors. Where at first, I got a row in my db (only the sessionid and expiration-columns were filled, no 'value' whatsoever...), now I don't get anything and NO errors...

 

Anyway: This is how I initialize:

require_once 'classes/cls_session.php';
$S = new Session;
session_start();
session_regenerate_id(true);

 

THX for any insights!

Link to comment
Share on other sites

The code I posted above still doesn't work - just wanted to add that my 'session_set_save_handler' was originally put in a constructor for the class, but I also tried it like this because the php.net-manual stated that the open() and close() work as a constructor and destructor to the class.

 

Reading what I posted above makes no sense: the session_set_save_handler should be outside the session-functions, maybe even outside the class.

 

Zl.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.