Seite 1 von 3
phpbb_sessions mit phpMyAdmin geleert, Fehler bleibt
Verfasst: 30.09.2004 08:33
von Jockel725
Hallo,
heute über Nacht ist unser Board abgestürzt. Version 2.0.10 mit einigen Mods. Bei Aufruf erscheint folgende Meldung:
phpBB : Kritischer Fehler
Error creating new session
DEBUG MODE
SQL Error : 1062 Duplicate entry 'bc' for key 1
INSERT INTO phpbb_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES ('bc948b70de6942b0153c7acd836b0652', -1, 1096525597, 1096525597, 'd527dec7', 0, 0)
Line : 159
File : /home/www/web147/html/forum/includes/sessions.php
Habe die Tabelle phpbb_sessions mit phpMyAdmin geleert, nun ist das Board teilweise erreichbar. Bei jedem 2 oder 3 Aufruf erscheit wieder die Fehlermeldung, ein Reload beseitigt Diese wieder. User berichten mir den gleichen Fehler.
www.taxiforum.de
Es ist nicht möglich, neue Postings zu schreiben. Fehlermeldung wie oben!
Neues Problem: Seit der Leerung der phpbb_sessions kann ich mich nicht mehr in den Adminbereich einloggen! Entwerder erscheint die beschreibene Fehlermeldung, oder ich werde einfach zum Forum weitergelinkt.
Wer kann bitte helfen?
Viele Grüße,
Jakob
Verfasst: 30.09.2004 10:45
von MrMind
Habe gerade geschaut.
Fehler kam ja mehr als genug
Es ist merkwürdig, da das Board teilweise läuft und dann wieder nicht. Sprich eine Verbindung zur DB steht ja.
Kontrolliere mal deine session.php im includes-Ordner nach folgender Funktion:
Code: Alles auswählen
function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_autologin = 0)
{
global $db, $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'];
if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) )
{
$session_id = isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : '';
$sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();
$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 = '';
}
$last_visit = 0;
$current_time = time();
$expiry_time = $current_time - $board_config['session_length'];
//
// Try and pull the last time stored in a cookie, if it exists
//
$sql = "SELECT *
FROM " . USERS_TABLE . "
WHERE user_id = $user_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, 'Could not obtain lastvisit data from user table', '', __LINE__, __FILE__, $sql);
}
$userdata = $db->sql_fetchrow($result);
if ( $user_id != ANONYMOUS )
{
$auto_login_key = $userdata['user_password'];
if ( $auto_create )
{
if ( isset($sessiondata['autologinid']) && $userdata['user_active'] )
{
// We have to login automagically
if( $sessiondata['autologinid'] == $auto_login_key )
{
// autologinid matches password
$login = 1;
$enable_autologin = 1;
}
else
{
// No match; don't login, set as anonymous user
$login = 0;
$enable_autologin = 0;
$user_id = $userdata['user_id'] = ANONYMOUS;
}
}
else
{
// Autologin is not set. Don't login, set as anonymous user
$login = 0;
$enable_autologin = 0;
$user_id = $userdata['user_id'] = ANONYMOUS;
}
}
else
{
$login = 1;
}
}
else
{
$login = 0;
$enable_autologin = 0;
}
//
// 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 = "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
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !$db->sql_query($sql) || !$db->sql_affectedrows() )
{
$session_id = md5(uniqid($user_ip));
$sql = "INSERT INTO " . SESSIONS_TABLE . "
(session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in)
VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !$db->sql_query($sql) )
{
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
}
}
Der Fehler tritt deswegen ein weil die DB sagt, das es die Session schon gibt: Doppelter Eintrag.
Dies kann eigentlich ja nur sein, wenn sie schon vorhanden war bzw. mit der UPDATE Anweisung aktualliesiert wurde, aber dann dürfte es nicht mehr die INSERT Anweisung ausführen.
Kontrolliere bitte dochmal ob die Funktion soweit bei dir auch aussieht (sie ist noch größer aber das nützt einem ja nichts, da der Fehler in diesen Zeilen auftritt).
Surf mal auf deinem Board rum und halte über phpMyAdmin auch die Session-Tabelle im Auge wie diese sich verhält, kann manchmal ganz hilfreich sein.
Die Session-Tabelle hat aber nicht direkt was mit dem ACP zu tun, da der Zugang über die user_level aus der Tabelle Users arbeitet.
Wenn dir wirklich niemand mehr helfen kann, mach mal ein BackUp der Dateien und der DB. Spiel das Board neu auf und versuch das BackUp der DB drauf zu spielen (nach dem du deine Mods wieder eingebaut hast).
Dies sollte aber wirklich die aller letzte Lösung sein.
Mfg
MrMind
Verfasst: 30.09.2004 11:09
von Jockel725
Hallo MrMind,
ich habe Dir hier mal den Auszug der sessions.php gepostet.
Kenne mich damit nicht aus, die Auswertung überlasse ich lieber Dir. Die Kernfrage ist, was hat den "Störfall" ausgelöst? Kein ACP-Zugriff, keine Postings, nix geht. Echter Mist!
-----------------------
function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_autologin = 0)
{
global $db, $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'];
if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) )
{
$session_id = isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : '';
$sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();
$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 = '';
}
$last_visit = 0;
$current_time = time();
$expiry_time = $current_time - $board_config['session_length'];
//
// Try and pull the last time stored in a cookie, if it exists
//
$sql = "SELECT *
FROM " . USERS_TABLE . "
WHERE user_id = $user_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, 'Could not obtain lastvisit data from user table', '', __LINE__, __FILE__, $sql);
}
$userdata = $db->sql_fetchrow($result);
if ( $user_id != ANONYMOUS )
{
$auto_login_key = $userdata['user_password'];
if ( $auto_create )
{
if ( isset($sessiondata['autologinid']) && $userdata['user_active'] )
{
// We have to login automagically
if( $sessiondata['autologinid'] == $auto_login_key )
{
// autologinid matches password
$login = 1;
$enable_autologin = 1;
}
else
{
// No match; don't login, set as anonymous user
$login = 0;
$enable_autologin = 0;
$user_id = $userdata['user_id'] = ANONYMOUS;
}
}
else
{
// Autologin is not set. Don't login, set as anonymous user
$login = 0;
$enable_autologin = 0;
$user_id = $userdata['user_id'] = ANONYMOUS;
}
}
else
{
$login = 1;
}
}
else
{
$login = 0;
$enable_autologin = 0;
}
//
// 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 = "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
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !$db->sql_query($sql) || !$db->sql_affectedrows() )
{
$session_id = md5(uniqid($user_ip));
$sql = "INSERT INTO " . SESSIONS_TABLE . "
(session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in)
VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !$db->sql_query($sql) )
{
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
}
}
Verfasst: 30.09.2004 11:28
von MrMind
Mh also ich konnte jetzt keinen Fehler entdecken.
Hast du ein BackUp deiner DB???
Wenn ja, dann würde ich die jetzige mal Sichern und dann das alte BackUp drauf spielen. Evtl. hat der Absturzt die DB ein bissl durcheinander gebracht (kann ich mir net vorstellen, kann aber sein).
Eigentlich kann ja nichts an den Files sein, also denke ich mal das die DB was ab bekommen hat.
Wenn du kein älteres BackUp hast, dann wird es schwer es den Fehler zu reproduzieren sprich herauszustellen woran das lag.
Mfg
MrMind
Verfasst: 30.09.2004 11:40
von Jockel725
Ich habe die DB-Backups über das ACP gemacht. Nur ich habe ja keinen Zugriff mehr auf das ACP. Wenn ich mich einloggen möchte, komme ich auf der Forensite raus.
http://www.taxiforum.de/forum/admin/index.php
geht nicht richtig.
Das ist auch neu. Was ist da bloß passiert??
Verfasst: 30.09.2004 11:43
von Leuchte
Bringt dich dieser Artikel weiter?
KB:sessions
Verfasst: 30.09.2004 12:02
von Jockel725
Danke für den Tipp. Den Artikel hatte ich aber schon gelesen. Hat nicht viel gebracht. Das brennende Problem ist neben den Fehlermeldungen der gestörte ACP Zugang. Von dort würde ich ansonsten ein Backup der DB wagen, aber wie gesagt, kein Zugriff!
Verfasst: 30.09.2004 14:36
von MrMind
Das BackUp welches du über das ACP angelegt hast, kannste auch via phpMyAdmin einspielen.
Mfg
MrMind
Verfasst: 30.09.2004 14:48
von Jockel725
Wunderbar, nur habe ich davon keine Ahnung! Kannst Du mir eine Schritt für Schritt Anleitung geben?
Was taugt den dieser DB Maitenance Mod? Wollte den vor Verzweiflung schon einspielen.
Frage: Wird der gestörte ACP Zugang auch über die Datenbank gesteuert? Konnte in den Foren dazu keine Aussage finden. Wenn zumindest der Zugriff ginge!
Gruß Jockel
Verfasst: 30.09.2004 16:17
von Jockel725
Habe nun den DB Maitenance Mod eingespielt, der kann aber keine Fehler finden. Alles ok. Hatte gehofft, mit dem Mod wieder Zugriff auf das ACP zu bekommen, war leider nichts.
Wenn ich den Admin-Link unten im Forum drücke, werde ich zum Forum, aber nicht zum ACP weitergeleitet.
Bitte um Hilfe!
Danke,
Jockel