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

Reply via email to