RE: php sessions using mysql (or any db)

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

 



This works great :-) Thanks.  

I'll write a letter to onlamp.com to get that misleading code off their
website (maybe it's PHP3 based?).
Perhaps this should be added to PEAR?  It appears that this is the
proper repository for such things.  I'll look into it although I would
be much obliged if somebody in the know could handle this since I am new
to PHP.

One thing I left out - I had to take out the $GLOBALS[acdb] part from
mysql_query.  This doesn't work with my version of php (4.2.3) I guess.
Also, assert(!empty($SessionTableName)); didn't work, so I commented it
out.


> -----Original Message-----
> From: Peter Beckman [mailto:beckman@purplecow.com] 
> Sent: Monday, November 18, 2002 12:01 PM
> To: Adam Nelson
> Cc: php-db@lists.php.net; 'Rasmus Lerdorf'
> Subject: RE:  php sessions using mysql (or any db)
> 
> 
> <?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
>        '
>            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