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
https://forums.phpfreaks.com/topic/224520-session_set_save_handler-to-postgresql/
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.

Archived

This topic is now archived and is closed to further replies.

×
×
  • 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.