phpbb_sessions mit phpMyAdmin geleert, Fehler bleibt

Probleme bei der regulären Arbeiten mit phpBB, Fragen zu Vorgehensweisen oder Funktionsweise sowie sonstige Fragen zu phpBB im Allgemeinen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

phpbb_sessions mit phpMyAdmin geleert, Fehler bleibt

Beitrag 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
Zuletzt geändert von Jockel725 am 30.09.2004 17:32, insgesamt 3-mal geändert.
Benutzeravatar
MrMind
Mitglied
Beiträge: 464
Registriert: 29.11.2003 17:14
Wohnort: Darmstadt/Odw
Kontaktdaten:

Beitrag 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
Selbst ist der Coder
Coder unter Linux
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

Beitrag 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);
}
}
Benutzeravatar
MrMind
Mitglied
Beiträge: 464
Registriert: 29.11.2003 17:14
Wohnort: Darmstadt/Odw
Kontaktdaten:

Beitrag 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
Selbst ist der Coder
Coder unter Linux
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

Beitrag 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??
Benutzeravatar
Leuchte
Ehemaliges Teammitglied
Beiträge: 9179
Registriert: 26.05.2003 14:57
Wohnort: Duisburg
Kontaktdaten:

Beitrag von Leuchte »

Bringt dich dieser Artikel weiter?
KB:sessions
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

Beitrag 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!
Benutzeravatar
MrMind
Mitglied
Beiträge: 464
Registriert: 29.11.2003 17:14
Wohnort: Darmstadt/Odw
Kontaktdaten:

Beitrag von MrMind »

Das BackUp welches du über das ACP angelegt hast, kannste auch via phpMyAdmin einspielen.

Mfg
MrMind
Selbst ist der Coder
Coder unter Linux
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

Beitrag 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
Jockel725
Mitglied
Beiträge: 23
Registriert: 19.04.2004 07:49
Wohnort: Hamburg

Beitrag 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
Antworten

Zurück zu „phpBB 2.0: Administration, Benutzung und Betrieb“