Hallo Steffen,
es ist eine gute Idee, relevanten Code zu kopieren, statt abzuschreiben.
Ich gehe davon aus, dass Dein Produktivcode anders aussieht.
Das da enthält viele Fehler:
$query = "update user set
last_update = "".time()."",
where
Session = "".session_id()."" AND
time_to_sec(timediff(now(), FROM_UNIXTIME(last_update)) < $maxpause) AND
user_gesperrt = "0"
";
Ich korrigiere als erstes die Anführungszeichen:
~~~php
$query = "
UPDATE user SET
last_update = '" . time() . "', -- hier ist ein Komma zuviel
WHERE
Session = '" . session_id() . "'
AND time_to_sec(timediff(now(), FROM_UNIXTIME(last_update)) < $maxpause)
AND user_gesperrt = "0"
";
Nach dieser Korrektur haben wir immer noch ein ungültiges SQL-Statement, was dazu führt, dass $result *immer* false enthalten wird.
$result=mysql_query($query);
Nehme ich jetzt an, dass der Komma-Fehler in Deinem Produktivcode nicht enthalten ist, so kommen wir an Deine logischen Fehler. Der folgende Code besagt:
if (($result == FALSE) || (mysql_affected_rows() < 1) )
{
header("Location: logout.php);
exit;
}
Wenn aus irgendeinem Grund mysql_query() fehlschlägt, was immer mal passieren kann, wird der User rausgeschmissen. Wenn keine Datensätze geändert werden, was immer mal passieren kann, wird der User rausgeschmissen. Beachte dazu den zweiten Hinweis im Handbuch zu mysql_affected_rows(), ich zitiere:
<zitat>
Hinweis: Benutzen Sie UPDATE wird MySQL keine Spalten aktualisieren,
bei denen der neue dem alten Wert entpspricht. Das kann dazu führen,
dass mysql_affected_rows() nicht die tatsächliche Anzahl der betroffenen
Zeilen liefert, sondern nur die, die wörtlich durch die Anfrage betroffen
sind.
</zitat>
Wird das Skript zweimal innerhalb der gleichen Sekunde aufgerufen und erfolgreich abgearbeitet, so wird der Benutzer herausgeworfen.
Freundliche Grüße
Vinzenz