RE: php sessions using mysql (or any db)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



<?php  // I got this somewhere.  It works.
       // This code is released under the same license as PHP. (http://www.php.net/license.html)
       assert(get_cfg_var("session.save_handler") == "user");
   // Without save_handler being set to user, everything works fine until it calls the write handler.
       $SessionTableName = get_cfg_var("session.save_path"); // [$database.]tablename
       assert(!empty($SessionTableName));
           function db_error_message() {
                 return mysql_error();
           }
       function mysql_session_open ($save_path, $session_name) {
           return true;
       }
       function mysql_session_close() {
           return true;
       }
       function mysql_session_read ($SessionID) {
           global $SessionTableName;
           $SessionID = addslashes($SessionID);
           $session_data = mysql_query("SELECT Data FROM $SessionTableName WHERE SessionID = '$SessionID'",$GLOBALS[acdb]) or
die(db_error_mess
age());
           if (mysql_numrows($session_data) == 1) {
               return mysql_result($session_data, 0);
           } else {
               return false;
           }
       }
       function mysql_session_write ($SessionID, $val) {
           global $SessionTableName;
           $SessionID = addslashes($SessionID);
           $val = addslashes($val);
           $SessionExists = mysql_result(mysql_query("SELECT COUNT(*) FROM $SessionTableName WHERE SessionID = '$SessionID'",$GLOBALS[acdb]),
0
);
           if ($SessionExists == 0) {
               $retval = mysql_query("INSERT INTO $SessionTableName (SessionID, LastActive, Data) VALUES ('$SessionID',
                           UNIX_TIMESTAMP(NOW()),'$val')",$GLOBALS[acdb]) or die(db_error_message());
           } else {
               $retval = mysql_query("UPDATE $SessionTableName SET Data = '$val', LastActive = UNIX_TIMESTAMP(NOW()) WHERE SessionID =
                           '$SessionID'",$GLOBALS[acdb]) or die(db_error_message());
               if (mysql_affected_rows() < 0) {
                   error_log("unable to update session data for session $SessionID");
               }
           }
           return $retval;
       }
       function mysql_session_destroy ($SessionID) {
           global $SessionTableName;
           $SessionID = addslashes($SessionID);
           $retval = mysql_query("DELETE FROM $SessionTableName WHERE SessionID = '$SessionID'",$GLOBALS[acdb]) or die(db_error_message());
           return $retval;
       }
       function mysql_session_gc ($maxlifetime = 604800) {
           global $SessionTableName;
           $CutoffTime = time() - $maxlifetime;
           $retval = mysql_query("DELETE FROM $SessionTableName WHERE LastActive < $CutoffTime",$GLOBALS[acdb]) or die(db_error_message());
           return $retval;
       }
       session_set_save_handler (
           'mysql_session_open',
           'mysql_session_close',
           'mysql_session_read',
           'mysql_session_write',
           'mysql_session_destroy',
           'mysql_session_gc'
       );
?>
On Mon, 18 Nov 2002, Adam Nelson wrote:

> Thanks for the clarification with the returns.  I made the changes
> however and it still doesn't work.  This code comes pretty much straight
> off the presses from http://www.onlamp.com/lpt/a/832
>
> What I have is quite modified from what is on there as it is quite buggy
> to begin with.  Anyway, It still doesn't work.  In perl, this would have
> been done already.  I can't be the first person to try running sessions
> on a database.  Does anyone have a session.inc file that would be
> appropriate for me.  I feel like it should just be in the php base
> files.
>
>
> > -----Original Message-----
> > From: Rasmus Lerdorf [mailto:rasmus@php.net]
> > Sent: Friday, November 15, 2002 4:59 PM
> > To: Adam Nelson
> > Cc: php-db@lists.php.net
> > Subject: Re:  php sessions using mysql (or any db)
> >
> >
> > > CREATE TABLE `SessionsTable` (
> > >   `SID` varchar(32) NOT NULL default '',
> >
> > This doesn't need to be a varchar.  The sid will always be 32
> > chars, so
> > make it a char(32)
> >
>
> This is just an artifact of InnoDB/Mysql.  I don't know the specifics,
> but I think char is no longer used by InnoDB (ie. it is just an alias
> for varchar).  Anyway, I put in char, the ddl pops out as varchar.
>
> > >   `expiration` int(11) NOT NULL default '0',
> >
> > I would suggest using a "timestamp" type here so MySQL will handle
> > updating it for you automatically.
>
> timestamp would change with every update.  This is a field to describe
> when the record should expire
>
> >
> > > function mysql_session_open($session_path, $session_name) {
> > >
> > >   mysql_pconnect("localhost", "root", "")
> > >          or die("Can't connect to MySQL server! ");
> > >
> > >   mysql_select_db("globalDB")
> > >          or die("Can't select MySQL sessions database");
> > >
> > > } // end mysql_session_open()
> >
> > You need to return true; at the end of this.
> >
> true.
>
> > > function mysql_session_close() {
> > >
> > >   return 1;
> >
> > No, use return true;
> >
> > > function mysql_session_select($SID) {
> > >
> > >   GLOBAL $sess_db;
> > >   GLOBAL $sess_table;
> > >
> > >   $query = "SELECT value FROM $sess_table
> > >       WHERE SID = '$SID' AND
> > >       expiration > ". time();
> > >
> > >   $result = mysql_query($query);
> > >
> > > } // end mysql_session_select()
> >
> > Uh, you need to return the actual value here or an empty string on an
> > error.
> >
> > > function mysql_session_write($SID,$value) {
> > >
> > >   GLOBAL $sess_db;
> > >   GLOBAL $sess_table;
> > >   GLOBAL $lifetime;
> > >
> > >   $expiration = time() + $lifetime;
> > >
> > >   $query = "INSERT INTO $sess_table
> > >       VALUES('$SID', '$expiration', '$value')";
> > >
> > >   $result = mysql_query($query);
> > >
> > >   if (! $result) :
> > >
> > >    $query = "UPDATE $sess_table SET
> > >        expiration = '$expiration',
> > >        value = '$value' WHERE
> > >        SID = '$SID' AND expiration >". time();
> > >    $result = mysql_query($query);
> > >
> > >   endif;
> > >
> > > } // end mysql_session_write()
> >
> > Again, you *must* return true; on a sucessful write.
> >
> > > function mysql_session_destroy($sessionID) {
> > >
> > >   GLOBAL $sess_table;
> > >
> > >   $query = "DELETE FROM $sess_table
> > >       WHERE SID = '$sessionID'";
> > >   $result = mysql_query($query);
> > >
> > > } // end mysql_session_destroy()
> >
> > return true;
> >
> > -Rasmus
> >
> >
> >
> >
>
>
>
>
> --
> PHP Database Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>

---------------------------------------------------------------------------
Peter Beckman            Systems Engineer, Fairfax Cable Access Corporation
beckman@purplecow.com                             http://www.purplecow.com/
---------------------------------------------------------------------------


-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux