Im using my following code to save sessions:
<?php
//set sessions handler on php
session_set_save_handler (array(&$session, '_open'),
array(&$session, '_close'),
array(&$session, '_read'),
array(&$session, '_write'),
array(&$session, '_destroy'),
array(&$session, '_gc'));
class session
{
var $session_limit = 300;
function session(&$db){
//set db handler
$this->db = $db;
}
/* Open session, if you have your own db connection
code, put it in here! */
function _open($path, $name) {
if (isset($this->db)) return TRUE;
else return FALSE;
}
/* Close session */
function _close() {
/* This is used for a manual call of the
session gc function */
$this->_gc(0);
return TRUE;
}
/* Read session data from database */
function _read($ses_id) {
$session_sql = "SELECT * FROM sessions WHERE ses_id = '$ses_id'";
$session_res = $this->db->getRow($session_sql);
if (!$session_res) {
return '';
}
// $session_num = $session_res->numRows();
if ($session_res) {
// $session_row = $session_res->fetchRow();
$ses_data = $session_res["ses_value"];
//$session_res->free()
return $ses_data;
} else {
return '';
}
}
/* Write new data to database */
function _write($ses_id, $data) {
$session_sql = "UPDATE sessions SET ses_time='" . time()
. "', ses_value='$data' WHERE ses_id='$ses_id'";
$session_res = $this->db->query($session_sql);
if (!$session_res) {
return FALSE;
}
if ($this->db->affectedRows() <> 0) {
return TRUE;
}
$session_sql = "INSERT INTO sessions (ses_id, ses_time, ses_start, ses_value)"
. " VALUES ('$ses_id', '" . time()
. "', '" . time() . "', '$data')";
$session_res = $this->db->query($session_sql);
if (!$session_res) {
return FALSE;
} else {
return TRUE;
}
}
/* Destroy session record in database */
function _destroy($ses_id) {
$session_sql = "DELETE FROM sessions WHERE ses_id = '$ses_id'";
$session_res = $this->db->query($session_sql);
if (!$session_res) {
return FALSE;
} else {
return TRUE;
}
}
/* Garbage collection, deletes old sessions */
function _gc($life) {
$ses_life = $this->session_limit;
$session_sql = "DELETE FROM sessions WHERE ses_time < (UNIX_TIMESTAMP()-$ses_life)";
$session_res = $this->db->query($session_sql);
if (!$session_res) {
return FALSE;
} else {
return TRUE;
}
}
/* Users online*/
function users() {
$users_sql = "SELECT COUNT(ses_id) FROM sessions";
$users_res = $this->db->getOne($users_sql);
if (!$session_res) {
return NULL;
} else {
return $users_res;
}
}
}
?>
Intermittently, if my session times out and I log back in, I get the error that it cannot insert record because the record already exists... Where is my error in logic?