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