Could someone help me to get custom session handlers working?
This seems to half work, on some pages it writes session to DB but on other pages writes session with no data. Also print_r($_SESSION) does not display any session vars anymore.
Database table:
id - varchar(32 - NULL No - Default None - Primary Key
access - int(10) - unsigned - NULL Yes - Default NULL
data - text - NULL Yes - Default NULL
In front controller (bespoke framework)
require_once('../application/models/sessionfn.php');
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start();
In sessionfn.php
function _open()
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
$dbname=$config->get("db");
$user=$config->get("dbuser");
$pass=$config->get("dbpass");
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
}
function _close()
{
$dbh = null;
}
function _read($id)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
$dbname=$config->get("db");
$user=$config->get("dbuser");
$pass=$config->get("dbpass");
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
$sth->execute();
}
function _write($id, $data)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
$dbname=$config->get("db");
$user=$config->get("dbuser");
$pass=$config->get("dbpass");
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$access = time();
$sth = $dbh->prepare("REPLACE INTO sessions VALUES ('$id', '$access', '$data')");
$sth->execute();
}
function _destroy($id)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
$dbname=$config->get("db");
$user=$config->get("dbuser");
$pass=$config->get("dbpass");
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$sth = $dbh->prepare("DELETE FROM sessions WHERE id = '$id'");
$sth->execute();
}
function _clean($max)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
$dbname=$config->get("db");
$user=$config->get("dbuser");
$pass=$config->get("dbpass");
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$old = time() - $max;
$sth = $dbh->prepare("DELETE FROM sessions WHERE access < '$old'");
$sth->execute();
}
It is very hard to debug your code when I am not hands-on. 🙂
But this might help: How to debug your own sessionhandler?
Set up a system that can write away your output to a file. When using your own sessionhandlers, no errors are displayed.
So add a function to sessionfn.php called: writeToLog($someStr) that write to some customlogfile of your own. Add timestamps to it. Append to the existing file.
Now you can check all the returnvalues of your functioncalls.
Simply empty your logfile, and start with your testing. On each step check the logfile.
It is not much work to set up, and you can see all your problems.