Page 1 of 1

[SOLVED] Session Table Full error

PostPosted: Fri Nov 09, 2007 12:56 pm
Author: BMD
I am getting the following error message when I go to my site.....

phpBB : Critical Error

Error creating new session

DEBUG MODE

SQL Error : 1114 The table '*****_sessions' is full

INSERT INTO ********_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in, session_admin) VALUES ('cda0f924e07635d8ba0b094962fb5494', -1, 1194637581, 1194637581, '9d156568', -13, 0, 0)

Line : 200
File : sessions.php


This is the second time this has happened in the past week.

The last time it resolved itself.

Does the table clear a session once it is closed out? Logicaly you would assume that once a user left the site the session would be cleared.

I have noticed I am getting crawled by yahoo bots a lot now... sometimes 8 at a time.

Could this be causing the problem?... If so.. any suggestions on curtailing the bot traffic, so only one at a time is on the site at any given time?

Thanks in advance.

Cheers
Doug

Re: Session Table Full error

PostPosted: Fri Nov 09, 2007 11:05 pm
Author: Helter
try this for includes/sessions.php

Code: Select all
 <php>sql_query($sql)))             {                 message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);             }               $userdata = $db->sql_fetchrow($result);             $db->sql_freeresult($result);                     $enable_autologin = $login = 1;         }         else if (!$auto_create)         {             $sessiondata['autologinid'] = '';             $sessiondata['userid'] = $user_id;               $sql = 'SELECT *                 FROM ' . USERS_TABLE . '                 WHERE user_id = ' . (int) $user_id . '                     AND user_active = 1';             if (!($result = $db->sql_query($sql)))             {                 message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);             }               $userdata = $db->sql_fetchrow($result);             $db->sql_freeresult($result);               $login = 1;         }     }       //     // At this point either $userdata should be populated or     // one of the below is true     // * Key didn't match one in the DB     // * User does not exist     // * User is inactive     //     if (!sizeof($userdata) || !is_array($userdata) || !$userdata)     {         $sessiondata['autologinid'] = '';         $sessiondata['userid'] = $user_id = ANONYMOUS;         $enable_autologin = $login = 0;           $sql = 'SELECT *             FROM ' . USERS_TABLE . '             WHERE user_id = ' . (int) $user_id;         if (!($result = $db->sql_query($sql)))         {             message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);         }           $userdata = $db->sql_fetchrow($result);         $db->sql_freeresult($result);     }       //     // Initial ban check against user id, IP and email address     //     preg_match('/(..)(..)(..)(..)/', $user_ip, $user_ip_parts);       $sql = "SELECT ban_ip, ban_userid, ban_email         FROM " . BANLIST_TABLE . "         WHERE ban_ip IN ('" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . $user_ip_parts[4] . "', '" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . "ff', '" . $user_ip_parts[1] . $user_ip_parts[2] . "ffff', '" . $user_ip_parts[1] . "ffffff')             OR ban_userid = $user_id";     if ( $user_id != ANONYMOUS )     {         $sql .= " OR ban_email LIKE '" . str_replace("'", "''", $userdata['user_email']) . "'             OR ban_email LIKE '" . substr(str_replace("'", "''", $userdata['user_email']), strpos(str_replace("'", "''", $userdata['user_email']), "@")) . "'";     }     if ( !($result = $db->sql_query($sql)) )     {         message_die(CRITICAL_ERROR, 'Could not obtain ban information', '', __LINE__, __FILE__, $sql);     }       if ( $ban_info = $db->sql_fetchrow($result) )     {         if ( $ban_info['ban_ip'] || $ban_info['ban_userid'] || $ban_info['ban_email'] )         {             message_die(CRITICAL_MESSAGE, 'You_been_banned');         }     }       //     // Create or update the session     //     $sql_ip = $user_id == ANONYMOUS ? " AND session_ip = '$user_ip'" : '';     $sql = "UPDATE " . SESSIONS_TABLE . "         SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login, session_admin = $admin         WHERE session_id = '" . $session_id . "'             AND session_ip = '$user_ip'";       if ( !$db->sql_query($sql) || !$db->sql_affectedrows() )     {         $session_id = md5(dss_rand());                 global $HTTP_SERVER_VARS;         $session_id = ( !strstr($HTTP_SERVER_VARS['HTTP_USER_AGENT'] ,'Googlebot') ) ? md5(uniqid(mt_rand(), true)) : md5(d8ef2eab);           $sql = "INSERT INTO " . SESSIONS_TABLE . "             (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in, session_admin)             VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login, $admin)";         if ( !$db->sql_query($sql) )         {             $error = TRUE;             if (SQL_LAYER == "mysql" || SQL_LAYER == "mysql4")             {                 $sql_error = $db->sql_error($result);                 if ($sql_error["code"] == 1114)                 {                  $result = $db->sql_query('SHOW TABLE STATUS LIKE "'.SESSIONS_TABLE.'"');                 $row = $db->sql_fetchrow($result);                 if ($row["Type"] == "HEAP" || $row["Engine"] == "MEMORY")                 {                 if ($row["Rows"] > 500)                 {                   $delete_order = (SQL_LAYER=="mysql4") ? " ORDER BY session_time ASC" : "";                     $db->sql_query("DELETE QUICK FROM ".SESSIONS_TABLE."$delete_order LIMIT 50");                 }                 else                 {                   $db->sql_query("ALTER TABLE ".SESSIONS_TABLE." MAX_ROWS=".($row["Rows"]+50));                 }                 if ($db->sql_query($sql))                 {                  $error = FALSE;                 }                 }                 }             }             if ($error)             {$sql = "TRUNCATE TABLE " . SESSIONS_TABLE . "";         if ( !$db->sql_query($sql) )         {             message_die(CRITICAL_ERROR, 'Error truncating sessions table', '', __LINE__, __FILE__, $sql);         }                 }         }     }       if ( $user_id != ANONYMOUS )     {         $last_visit = ( $userdata['user_session_time'] > 0 ) ? $userdata['user_session_time'] : $current_time;                 if (!$admin)         {           $sql = "UPDATE " . USERS_TABLE . "             SET user_session_time = $current_time, user_session_page = $page_id, user_lastvisit = $last_visit             WHERE user_id = $user_id";         if ( !$db->sql_query($sql) )         {             message_die(CRITICAL_ERROR, 'Error updating last visit time', '', __LINE__, __FILE__, $sql);         }           }           $userdata['user_lastvisit'] = $last_visit;           //         // Regenerate the auto-login key         //         if ($enable_autologin)         {             $auto_login_key = dss_rand() . dss_rand();                         if (isset($sessiondata['autologinid']) && (string) $sessiondata['autologinid'] != '')             {                 $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . "                     SET last_ip = '$user_ip', key_id = '" . md5($auto_login_key) . "', last_login = $current_time                     WHERE key_id = '" . md5($sessiondata['autologinid']) . "'";             }             else             {                 $sql = 'INSERT INTO ' . SESSIONS_KEYS_TABLE . "(key_id, user_id, last_ip, last_login)                     VALUES ('" . md5($auto_login_key) . "', $user_id, '$user_ip', $current_time)";             }               if ( !$db->sql_query($sql) )             {                 message_die(CRITICAL_ERROR, 'Error updating session key', '', __LINE__, __FILE__, $sql);             }                         $sessiondata['autologinid'] = $auto_login_key;             unset($auto_login_key);         }         else         {             $sessiondata['autologinid'] = '';         }  //       $sessiondata['autologinid'] = (!$admin) ? (( $enable_autologin && $sessionmethod == SESSION_METHOD_COOKIE ) ? $auto_login_key : '') : $sessiondata['autologinid'];         $sessiondata['userid'] = $user_id;     }       $userdata['session_id'] = $session_id;     $userdata['session_ip'] = $user_ip;     $userdata['session_user_id'] = $user_id;     $userdata['session_logged_in'] = $login;     $userdata['session_page'] = $page_id;     $userdata['session_start'] = $current_time;     $userdata['session_time'] = $current_time;     $userdata['session_admin'] = $admin;     $userdata['session_key'] = $sessiondata['autologinid'];       setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);     setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure);       //Begin Lo-Fi Mod     if ( $userdata['session_user_id'] != ANONYMOUS ){ $SID = 'sid=' . $session_id; } else { $SID = ''; }     //End Lo-Fi Mod       return $userdata;}  //// Checks for a given user session, tidies session table and updates user// sessions at each page refresh//function session_pagestart($user_ip, $thispage_id){     global $db, $lang, $board_config;     global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;       $cookiename = $board_config['cookie_name'];     $cookiepath = $board_config['cookie_path'];     $cookiedomain = $board_config['cookie_domain'];     $cookiesecure = $board_config['cookie_secure'];       $current_time = time();     unset($userdata);       if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) )     {         $sessiondata = isset( $HTTP_COOKIE_VARS[$cookiename . '_data'] ) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();         $session_id = isset( $HTTP_COOKIE_VARS[$cookiename . '_sid'] ) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : '';         $sessionmethod = SESSION_METHOD_COOKIE;     }     else     {         $sessiondata = array();         $session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : '';         $sessionmethod = SESSION_METHOD_GET;     }        if (!preg_match('/^[A-Za-z0-9]*$/', $session_id))      {           $session_id = '';      }       global $HTTP_SERVER_VARS;     if ( empty($session_id)  && strstr($HTTP_SERVER_VARS['HTTP_USER_AGENT'] ,'Googlebot') )     {         $sessiondata = '';         $session_id = md5(d8ef2eab);         $sessionmethod = SESSION_METHOD_GET;     }     $thispage_id = (int) $thispage_id;         //     // Does a session exist?     //     if ( !empty($session_id) )     {         //         // session_id exists so go ahead and attempt to grab all         // data in preparation         //         $sql = "SELECT u.*, s.*             FROM " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u             WHERE s.session_id = '$session_id'                 AND u.user_id = s.session_user_id";         if ( !($result = $db->sql_query($sql)) )         {             message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);         }           $userdata = $db->sql_fetchrow($result);           //         // Did the session exist in the DB?         //         if ( isset($userdata['user_id']) )         {             lw_check_membership($userdata);             //             // Do not check IP assuming equivalence, if IPv4 we'll check only first 24             // bits ... I've been told (by vHiker) this should alleviate problems with             // load balanced et al proxies while retaining some reliance on IP security.             //             $ip_check_s = substr($userdata['session_ip'], 0, 6);             $ip_check_u = substr($user_ip, 0, 6);               if (( $ip_check_s == $ip_check_u ) || ($session_id == md5(d8ef2eab)&&(strstr($HTTP_SERVER_VARS['HTTP_USER_AGENT'] ,'Googlebot'))))             {                 $SID = $userdata['user_id'] > 0 ? (($sessionmethod == SESSION_METHOD_GET || defined('IN_ADMIN')) ? 'sid=' . $session_id : '') : '';                   //                 // Only update session DB a minute or so after last update                 //                 if ( $current_time - $userdata['session_time'] > 60 )                 {                     // A little trick to reset session_admin on session re-usage                     $update_admin = (!defined('IN_ADMIN') && $current_time - $userdata['session_time'] > ($board_config['session_length']+60)) ? ', session_admin = 0' : '';                       $sql = "UPDATE " . SESSIONS_TABLE . "                         SET session_time = $current_time, session_page = $thispage_id$update_admin                         WHERE session_id = '" . $userdata['session_id'] . "'";                     if ( !$db->sql_query($sql) )                     {                         message_die(CRITICAL_ERROR, 'Error updating sessions table', '', __LINE__, __FILE__, $sql);                     }                       if ( $userdata['user_id'] != ANONYMOUS )                     {                         $sql = "UPDATE " . USERS_TABLE . "                             SET user_session_time = $current_time, user_session_page = $thispage_id                             WHERE user_id = " . $userdata['user_id'];                         if ( !$db->sql_query($sql) )                         {                             message_die(CRITICAL_ERROR, 'Error updating sessions table', '', __LINE__, __FILE__, $sql);                         }                     }                       session_clean($userdata['session_id']);                       setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);                     setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure);                 }                   // Add the session_key to the userdata array if it is set                 if ( isset($sessiondata['autologinid']) && $sessiondata['autologinid'] != '' )                 {                     $userdata['session_key'] = $sessiondata['autologinid'];                 }                   return $userdata;             }         }     }      elseif(empty($sessiondata))    {       // try to login guest       $sql = "SELECT u.*, s.*          FROM " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u          WHERE s.session_ip = '$user_ip'             AND s.session_user_id = " . ANONYMOUS . "             AND u.user_id = s.session_user_id                LIMIT 0, 1";       if ( !($result = $db->sql_query($sql)) )       {          message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);       }         $userdata = $db->sql_fetchrow($result);         if ( isset($userdata['user_id']) )       {          if ( $current_time - $userdata['session_time'] > 60 )          {             $sql = "UPDATE " . SESSIONS_TABLE . "                SET session_time = $current_time, session_start = $current_time, session_page = 0                WHERE session_id = '" . $userdata['session_id'] . "'";             if ( !$db->sql_query($sql) )             {                message_die(CRITICAL_ERROR, 'Error updating sessions table', '', __LINE__, __FILE__, $sql);             }          }          return $userdata;       }    }       //     // If we reach here then no (valid) session exists. So we'll create a new one,     // using the cookie user_id if available to pull basic user prefs.     //     $user_id = ( isset($sessiondata['userid']) ) ? intval($sessiondata['userid']) : ANONYMOUS;       if ( !($userdata = session_begin($user_id, $user_ip, $thispage_id, TRUE)) )     {         message_die(CRITICAL_ERROR, 'Error creating user session', '', __LINE__, __FILE__, $sql);     }       return $userdata;  }  /*** Terminates the specified session* It will delete the entry in the sessions table for this session,* remove the corresponding auto-login key and reset the cookies*/function session_end($session_id, $user_id){     global $db, $lang, $board_config, $userdata;     global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;       $cookiename = $board_config['cookie_name'];     $cookiepath = $board_config['cookie_path'];     $cookiedomain = $board_config['cookie_domain'];     $cookiesecure = $board_config['cookie_secure'];       $current_time = time();       if (!preg_match('/^[A-Za-z0-9]*$/', $session_id))     {         return;     }         //     // Delete existing session     //     $sql = 'DELETE FROM ' . SESSIONS_TABLE . "         WHERE session_id = '$session_id'             AND session_user_id = $user_id";     if ( !$db->sql_query($sql) )     {         message_die(CRITICAL_ERROR, 'Error removing user session', '', __LINE__, __FILE__, $sql);     }       //     // Remove this auto-login entry (if applicable)     //     if ( isset($userdata['session_key']) && $userdata['session_key'] != '' )     {         $autologin_key = md5($userdata['session_key']);         $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '             WHERE user_id = ' . (int) $user_id . "                 AND key_id = '$autologin_key'";         if ( !$db->sql_query($sql) )         {             message_die(CRITICAL_ERROR, 'Error removing auto-login key', '', __LINE__, __FILE__, $sql);         }     }       //     // We expect that message_die will be called after this function,     // but just in case it isn't, reset $userdata to the details for a guest     //     $sql = 'SELECT *         FROM ' . USERS_TABLE . '         WHERE user_id = ' . ANONYMOUS;     if ( !($result = $db->sql_query($sql)) )     {         message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql);     }     if ( !($userdata = $db->sql_fetchrow($result)) )     {         message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql);     }     $db->sql_freeresult($result);         setcookie($cookiename . '_data', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure);     setcookie($cookiename . '_sid', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure);       return true;}  /*** Removes expired sessions and auto-login keys from the database*/function session_clean($session_id){     global $board_config, $db;       //     // Delete expired sessions     //     $sql = "DELETE FROM " . SESSIONS_TABLE . "          WHERE UNIX_TIMESTAMP() - session_time >=172800          AND session_id <> '$session_id'";     if ( !$db->sql_query($sql) )     {         message_die(CRITICAL_ERROR, 'Error clearing sessions table', '', __LINE__, __FILE__, $sql);     }       //     // Delete expired auto-login keys     // If max_autologin_time is not set then keys will never be deleted     // (same behaviour as old 2.0.x session code)     //     if (!empty($board_config['max_autologin_time']) && $board_config['max_autologin_time'] > 0)     {         $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '             WHERE last_login <40>sql_query($sql);     }       return true;}  /*** Reset all login keys for the specified user* Called on password changes*/function session_reset_keys($user_id, $user_ip){     global $db, $userdata, $board_config;       $key_sql = ($user_id == $userdata['user_id'] && !empty($userdata['session_key'])) ? "AND key_id != '" . md5($userdata['session_key']) . "'" : '';       $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '         WHERE user_id = ' . (int) $user_id . "             $key_sql";       if ( !$db->sql_query($sql) )     {         message_die(CRITICAL_ERROR, 'Error removing auto-login keys', '', __LINE__, __FILE__, $sql);     }       $where_sql = 'session_user_id = ' . (int) $user_id;     $where_sql .= ($user_id == $userdata['user_id']) ? " AND session_id <userdata>sql_query($sql) )     {         message_die(CRITICAL_ERROR, 'Error removing user session(s)', '', __LINE__, __FILE__, $sql);     }       if ( !empty($key_sql) )     {         $auto_login_key = dss_rand() . dss_rand();           $current_time = time();                 $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . "             SET last_ip = '$user_ip', key_id = '" . md5($auto_login_key) . "', last_login = $current_time             WHERE key_id = '" . md5($userdata['session_key']) . "'";                 if ( !$db->sql_query($sql) )         {             message_die(CRITICAL_ERROR, 'Error updating session key', '', __LINE__, __FILE__, $sql);         }           // And now rebuild the cookie         $sessiondata['userid'] = $user_id;         $sessiondata['autologinid'] = $auto_login_key;         $cookiename = $board_config['cookie_name'];         $cookiepath = $board_config['cookie_path'];         $cookiedomain = $board_config['cookie_domain'];         $cookiesecure = $board_config['cookie_secure'];           setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);                 $userdata['session_key'] = $auto_login_key;         unset($sessiondata);         unset($auto_login_key);     }  }//// Append $SID to a url. Borrowed from phplib and modified. This is an// extra routine utilised by the session code above and acts as a wrapper// around every single URL and form action. If you replace the session// code you must include this routine, even if it's empty.//function append_sid($url, $non_html_amp = false){     global $SID, $HTTP_SERVER_VARS;       if ( !empty($SID) && !preg_match('#sid=#', $url) && !defined('IS_ROBOT')  )     {         $url .= ( ( strpos($url, '?') !== false ) ?  ( ( $non_html_amp ) ? '&' : '&' ) : '?' ) . $SID;     }       return $url;}  ?>  

Re: Session Table Full error

PostPosted: Sat Nov 10, 2007 3:51 pm
Author: BMD
Thanks for thew quick reply Helter

I backed up my original sesion.php in the includes folder and uploaded the one above...

I now get the following at the top of the page above the top banner row..

Warning: Cannot modify header information - headers already sent by (output started at /***/***/***/***/***/***/***/includes/sessions.php:671) in /***/***/***/***/***/***/***/includes/sessions.php on line 427

Warning: Cannot modify header information - headers already sent by (output started at /***/***/***/***/***/***/***/includes/sessions.php:671) in /***/***/***/***/***/***/***/sessions.php on line 428

Warning: Cannot modify header information - headers already sent by (output started at /***/***/***/***/***/***/***/includes/sessions.php:671) in /***/***/***/***/***/***/***/includes/page_header.php on line 956

Warning: Cannot modify header information - headers already sent by (output started at /***/***/***/***/***/***/***/includes/sessions.php:671) in /***/***/***/***/***/***/***/includes/page_header.php on line 958

Warning: Cannot modify header information - headers already sent by (output started at /***/***/***/***/***/***/***/includes/sessions.php:671) in /***/***/***/***/***/***/***/includes/page_header.php on line 959



I altered the path for obvioussecurity reasons .

I am going to reset the original seesions.php file for the time being.

Cheers
Doug

Re: Session Table Full error

PostPosted: Sat Nov 10, 2007 8:24 pm
Author: Helter
if you copied this code exactly, and did not add empty lines after the php close tag, it will not produce those errors.

edit* it appears that you left off the php close tag
Code: Select all
 ?>  

Re: Session Table Full error

PostPosted: Mon Nov 12, 2007 7:00 am
Author: BMD
Helter

There were no lines following.... however there were 3 "Spaces" after the
*?php
and
?>
at the end of the .script...I removed those and all seems fine now
for the moment.

Thanks for the help.

Cheers
Doug

Re: [SOLVED] Session Table Full error

PostPosted: Tue Nov 20, 2007 6:56 am
Author: BMD
Helter

I think this has done the trick.... thanks tons for all you guys do for us out here in the ether.

Cheers
Doug