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