Reputation: 75
I'm having issues with setting session_set_save_handler. I configured my php.ini to session.handler = user
This simple test is failing:
//Define custom session handler
if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")){
die('set fine');
}else{
die('Couldn\'t set session handler');
Here is my session class.
//Constructor
function __construct(){
//Define custom session handler
if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")){
die('set fine');
}else{
die('Couldn\'t set session handler');
}
//Start session
session_start();
}
//Custom session functions
function sess_open($sess_path, $sess_name) {
return true;
}
function sess_close() {
return true;
}
function sess_read($sess_id) {
//Query for session record in
$results = $db->QuerySingleRow("SELECT data FROM sessions WHERE session_id = '$sess_id'");
//Check that record is returned
if ($results != false)
{
//Session found, pull out data field value
$sess_data = $results->data;
//Grab current time
$CurrentTime = time();
//Update session record with current timestamp
$db->Query("UPDATE sessions SET last_updated = $CurrentTime WHERE session_id = '$sess_id'");
//Return
return $sess_data;
}
else
{
//No session found
//Grab current timestamp
$CurrentTime = time();
//Insert new session to DB
$db->Query("INSERT INTO sessions (session_id, last_updated) VALUES ('$sess_id', $CurrentTime)");
//Return blank per nature of session_set_save_handler read()
return '';
}
}
function sess_write($sess_id, $data) {
//Grab current timestamp
$CurrentTime = time();
//Update session record to hold new data and update last_updated field
$db->Query("UPDATE sessions SET data = '$data', last_updated = $CurrentTime WHERE session_id = '$sess_id'");
return true;
}
function sess_destroy($sess_id) {
//Delete session from DB
$db->Query("DELETE FROM sessions WHERE session_id = '$sess_id'");
return true;
}
function sess_gc($sess_maxlifetime) {
//Get current timestamp
$CurrentTime = time();
//Delete from session based on garbage collection
$db->Query("DELETE FROM sessions WHERE last_updated < $CurrentTime");
return true;
}
}
The only thing I can think of is $db is an suppose to be an object of my MySQL DB class but I can't include the class and then create an instance of it.
I didn't want to reinvent the wheel on the DB class so I grabbed it from Jeff Williams here: http://www.phpclasses.org/package/3698-PHP-MySQL-database-access-wrapper.html
I've tried to include it out side the class body put then the page doesn't render, just a blank white page no errors.:
<?php
include 'mysql.class.php';
$db = new MySQL(true);
class session
{
//Constructor
function __construct(){
....
Upvotes: 4
Views: 5071
Reputation: 13263
If you use the function inside the constructor then you need to pass in $this
like so:
session_set_save_handler(
array($this, 'sess_open'),
array($this, 'sess_close'),
array($this, 'sess_read'),
array($this, 'sess_write'),
array($this, 'sess_destroy'),
array($this, 'sess_gc')
);
And then instantiate the class
new SessionClass;
Whenever you are in doubt you can always take a look at the documentation. Be sure to read the comments as well; they are usually very helpful.
Upvotes: 1
Reputation: 197554
Setting the session save handler fails:
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")
Because these callbacks you want to register to do not exists:
var_dump(is_callable("sess_open")); # FALSE
That is because your object methods needs to be properly registered as callbacks. An object method callback is written in form of an array with two elements, the first one is the object, the second one a string of the methodname. Example from PHP net that is similar to yours:
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
As you can see, each method is written as a single array with the first element $handler
always.
From within the class you can use $this
to refer to the same object. But before your fully write your own, check the session_set_save_handler()
PHP manual page for infos, examples and user contributed notes. There are different ways how you can organize that for your case.
Upvotes: 2