RE: [PHP-DB] php sessions using mysql (or any db)
| From: | Peter Beckman | Date: | Tue, 19 Nov 2002 00:55:09 +0000 |
| Subject: | RE: [PHP-DB] php sessions using mysql (or any db) | ||
| References: | 1 | Groups: | php.db |
| Request: | Send a blank email to php-db+get-23462@lists.php.net to get a copy of this message | ||
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-DB] 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-DB] 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/
---------------------------------------------------------------------------