Re[2]: [PHP] SESSION Not behaving II: permission denied(13)
| From: | Tom Rogers | Date: | Sun, 19 Oct 2003 03:59:46 +0000 |
| Subject: | Re[2]: [PHP] SESSION Not behaving II: permission denied(13) | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-166635@lists.php.net to get a copy of this message | ||
Hi,
Sunday, October 19, 2003, 7:35:23 AM, you wrote:
> That would be one solution, but I am on a shared hosting server. I cannot
> change the folder permissions.
> I've asked tech support to look into this.
> Does anyone know where I can get a class that will save the session vars
> to mysql?
Here is a class I wrote a while back which will give you a good start.
The only weird thing I did was start a new session if read failed rather than
wait to check when writing the session data but it worked fine.
<?php
/*
SQL for table creation in db called admin
CREATE TABLE phpsessions (
sessionid varchar(64) NOT NULL default '',
sessionsize int(10) default NULL,
sessiondata mediumtext,
sessionname varchar(255) default NULL,
sesstime int(11) default NULL,
username varchar(64) default NULL,
sessend int(11) default NULL,
authid varchar(100) NOT NULL default '0',
PRIMARY KEY (sessionid)
) TYPE=MyISAM PACK_KEYS=1;
*/
class sessionClass{
var $ses; //session on flag
var $sessionname; //current name of session
var $message; //error message holder
var $modulename; //type of module, should be user
var $sessionid; //
var $con; //datbase handle
var $sessionlife; //how long inactive before the session should time out
var $maxgclife; //absolute time for session data to survive
var $host; //client host
var $Username; //username
var $authid; // a unique id for authClass created for a new session
function sessionClass($sessionname="",$lifetime="",$maxgc=""){
global $session_ref; //a reference array for access by buried functions
$session_ref[] =& $this;
ini_set( "session.save_handler", "user" );
function open($save_path, $session_name) {
global $session_ref;
$con = @mysql_connect("localhost" , "username" ,
"password" );
if($con):
@mysql_select_db("admin",$con);
$session_ref[0]->con = $con;
return true;
else:
return false;
endif;
}
function close() {
//global $session_ref;
//$con = $session_ref[0]->getcon();
//@mysql_close($con);
return true;
}
function read($key) {
global $session_ref;
$con = $session_ref[0]->con;
$sessionname = $session_ref[0]->sessionname;
$lifetime = $session_ref[0]->sessionlife;
$host =
ereg_replace("www.","",$_SERVER["HTTP_HOST"]);
$Username = substr($host,0,strpos($host,"."));
//format is username.domain.com
$session_ref[0]->setuser($host,$Username);
$val = "";
$sessiondata = "";
$now = time();
$insert = "Yes";
$result = @mysql_query("SELECT * FROM phpsessions WHERE sessionid =
'$key'",$con);
if($row = @mysql_fetch_array($result)):
$sesstime = $row["sesstime"];
$user = $row["username"];
$diff = $now - $sesstime;
if($Username != $user):
$result = @mysql_query("DELETE FROM phpsessions WHERE
sessionid = '$key'",$con);
$session_ref[0]->message = "<font
color=\"red\">Domain has changed, please login again.</font>";
else:
if($diff < $lifetime):
$sessiondata = $row["sessiondata"];
$result = @mysql_query("UPDATE phpsessions SET
sesstime = '$now' WHERE sessionid = '$key'",$con);
$insert = "No";
else:
$result = @mysql_query("DELETE FROM phpsessions
WHERE sessionid = '$key'",$con);
$session_ref[0]->message .= "<font
color=\"red\">Session has timed out, please login again.</font>";
endif;
endif;
endif;
if($insert == "Yes"):
$authid = md5(uniqid (rand()));
$result = mysql_query("INSERT INTO phpsessions
(sessionid,sessionsize,sessiondata,sessionname,sesstime,username,authid) VALUES
('$key',1,'$val','$sessionname','$now','$Username','$authid')",$con);
endif;
return $sessiondata;
}
function write($key, $val) {
global $session_ref;
$con = $session_ref[0]->con;
$val = ereg_replace("'","''",$val);
$result = @mysql_query("UPDATE phpsessions SET sessiondata =
'$val' WHERE sessionid = '$key'",$con);
return true;
}
function destroy($key) {
global $session_ref;
$con = $session_ref[0]->con;
$result = @mysql_query("DELETE FROM phpsessions WHERE sessionid =
'$key'",$con);
$session_ref[0]->ses = 0;
$session_ref[0]->sessionid = "";
$session_ref[0]->authid = "";
return true;
}
function gc($maxlifetime) {
global $session_ref;
$con = $session_ref[0]->con;
$sessionname = $session_ref[0]->sessionname; // this sesions
name
$min = time() - $session_ref[0]->sessionlife; //this session
name lifetime
$amin = time() - $session_ref[0]->maxgclife; //all sessions
max lifetime
$result = mysql_query("DELETE FROM phpsessions WHERE (sessionname =
'$sessionname' AND sesstime < $min) OR sesstime < $amin",$con);
//$session_ref[0]->message .= "<font
color=\"green\">Session gc called on $sessionname - min = $min .</font>";
return true;
}
session_set_save_handler("open", "close", "read",
"write", "destroy", "gc");
//set up some defaults
$this->sessionname = $sessionname;
$this->sessionlife = $lifetime;
if($this->sessionname == ""):
$this->sessionname = "PHPSESSID";
endif;
session_name($this->sessionname);
if($lifetime == ""):
$this->sessionlife = get_cfg_var("session.gc_maxlifetime");
endif;
if($maxgc == ""):
$this->maxgclife = 21600; //6hours
else:
$this->maxgclife = $maxgc;
endif;
//ok go for it
session_start();
$this->modulename = session_module_name();
$this->sessionid = session_id();
$this->ses = 1;
}
//oddball functions
function session_restart(){
session_destroy();
$url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"];
header("Location: $url");
exit;
}
function addmessage($mess){
$this->message .= $mess;
}
function getmessage(){
return $this->message;
}
function getmodulename(){
return $this->modulename;
}
function getid(){
return $this->sessionid;
}
function getlifetime(){
return $this->sessionlife;
}
function setuser($host,$user){
$this->host = $host;
$this->Username = $user;
}
function getuser($type = ""){
if($type == "u"):
return $this->Username;
elseif($type == "h"):
return $this->host;
else:
return $this->host." ".$this->Username;
endif;
}
}
?>
Usage:
include('sessionClass.inc');
$s =& new sessionClass('LOGIN',3600,7200);
//session named LOGIN 1 hour session lifetime and clear everything older than 2 hours
Then use $_SESSION like normal
--
regards,
Tom