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
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php