RE: php sessions using mysql (or any db)

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

 



On Mon, 18 Nov 2002, Adam Nelson wrote:

> 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.

 Whoops, the $GLOBALS[acdb] was legacy code for the site I was using.
 Ignore it.  Sorry!  Your SessionTableName is set in php.ini -- if
 $sessiontablename is empty, there is an issue that will prevent sessions
 from being written/read from!

Peter

> > -----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/
> >
> > --------------------------------------------------------------
> > -------------
> >
> >
> >
> >
>
>
>

---------------------------------------------------------------------------
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