I am testing user-handling of sessions (mysql database) and just do not understand
this behavior. my SESSION table is created as
CREATE TABLE SESSION (
id varchar(32) NOT NULL default '',
time timestamp(14) NOT NULL,
user_id mediumint(8) NOT NULL default '-1',
data text NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
I have a main script index.php3
<?php
require("./sessions.inc");
session_module_name("user");
session_set_save_handler("sess_open", "sess_close",
"sess_read", "sess_write", "sess_remove", "sess_gc");
session_start();
if (!isset($_SESSION['zzzz'])) {
$_SESSION['zzzz'] = 1;
print("<br>zzzz set" );
}
function increment() {
$_SESSION['zzzz']++;
echo "<br>zzzz=".$_SESSION['zzzz']."<br>";
}
function set_yyyy() {
echo "set yyyy<br>";
$_SESSION['yyyy'] = 666;
}
if (isset($_POST['MYVAR']))
set_yyyy();
else
increment();
echo "<a href=\"$PHP_SELF\">$PHP_SELF increment zzzz</A><br>";
echo "<a href=\"$PHP_SELF?MYVAR=3\">$PHP_SELF register yyyy</A>";
?>
and sessions.inc:
<?php
function session_table() {
return("SESSION");
}
function session_log($message) {
if($file = fopen("/tmp/session.txt", "a")) {
fwrite($file, date("Y-m-d H:i:s ") . $message . "\n");
fclose($file);
}
}
function sess_open($path, $name) {
session_log("session_open");
return(true);
}
function sess_close() {
session_log("session_close");
return(true);
}
function sess_read($id) {
session_log("session_read");
$db = mysql_pconnect('localhost','mysqluser','password');
if(!mysql_select_db('rfox_auth')) {
session_log("session_read select database error: "
. mysql_error());
return("");
}
$sql = "select * from " . session_table()
. " where id='" . $id . "'";
if(!$result = mysql_query($sql)) {
session_log("MySQL error: " . mysql_error()
. " with SQL: " . $sql);
return("");
}
if(mysql_num_rows($result)) {
session_log("MySQL query returned " . mysql_num_rows($result)
. " rows.");
$row = mysql_fetch_assoc($result);
session_log("session_read returned " . $row["data"]);
return($row["data"]);
}
else {
session_log("session_read found zero rows with SQL: " . $sql);
return("");
}
}
function sess_write($id, $data) {
session_log("session_write");
if(!mysql_select_db('rfox_auth')) {
session_log("session_write select database error: "
. mysql_error());
return(false);
}
$sql = "update " . session_table()
. " set data = '" . addslashes($data) . "', time = null";
$sql .= " where id='" . $id . "'";
if (!$result = mysql_query($sql)) {
session_log("session_write error " . mysql_error()
. " with SQL: " . $sql);
return(false);
}
if (mysql_affected_rows()) {
session_log("session_write update affected "
. mysql_affected_rows() . " rows with SQL: " . $sql);
return(true);
}
session_log("session_write updated zero rows with SQL: " . $sql);
$sql = "insert " . session_table()
. " set data = '" . addslashes($data) . "', id = '" . $id . "'";
if(!$result = mysql_query($sql)) {
session_log("session_write error " . mysql_error()
. " with SQL: " . $sql);
return(false);
}
else {
session_log("session_write inserted with SQL: " . $sql);
return(true);
}
}
function sess_remove($id)
{
session_log("session_remove");
if(!mysql_select_db('rfox_auth'))
{
session_log("session_remove select database error: "
. mysql_error());
return(false);
}
$sql = "delete " . session_table() . " where id='" . $id . "'";
if ($result = mysql_query($sql))
{
session_log("MySQL query delete worked.");
return(true);
}
else
{
session_log("MySQL update error: " . mysql_error()
. " with SQL: " . $sql);
return(false);
}
}
function sess_gc($life)
{
session_log("session_gc");
if (!mysql_select_db('rfox_auth')) {
session_log("session_gc select database error: " . mysql_error());
return(false);
}
$sql = "delete from " . session_table() . " where time < '"
. date("YmdHis", time() - $life) . "'";
session_log("session_gc sql: " . $sql);
if ($result = mysql_query($sql)) {
session_log("session_gc deleted " . mysql_affected_rows()
. " rows.");
return(true);
}
else {
session_log("session_gc error: " . mysql_error()
. " with SQL: " . $sql);
return(false);
}
}
?>
I can see in the log file that session_write() is executed when I register zzzz. But
there is a problem:
PROBLEM: When I register yyyy, there is no call to session_write() in the log file,
and no data for yyyy gets written to the database.
Can you duplicate this behavior on your system? Do you have an explanation?
Thanks!
Rich