PHP Session-Zeit funktioniert nicht richtig

Hattrix

Cadet 4th Year
Registriert
März 2007
Beiträge
111
Hallo,

und zwar habe ich mit session eine Zeit (2 Std.) festgelegt, wann ein Feature bei einem Brwosergame wieder zur Verfügung steht. Doch viele User melden, dass man auch nach 2 Std. nichts ändern kann.

PHP:
 $_SESSION['login_time'] = time();

 if(time() > $_SESSION['pruef'] + 7200)
 {

  if(time() > ($_SESSION['login_time'] + 7200 ))
  {
//   echo 'ende session';
  }
  else
  {

   if($_SESSION['pruef']=='') $_SESSION['pruef'] = time() - 7300;
   else $_SESSION['pruef'] = $_SESSION['login_time'] + 7200;
//   echo 'session aktiv';
  }

 }




  $pruef=$_SESSION['pruef'] + 7200;
  if(time() < $pruef

Was ist daran evtl. falsch?`Ich kann kein Fehler finden!
 
Wenn du das Script so verwendest, wie du es oben abgebildet hast, dann kann es gar nicht funktionieren, da du kurz vor dem Abgleich der Zeiten die Session mit dern Login-Zeit auf den aktuellen Zeitpunkt setzt. Zudem ist das Verfahren über Sessions bei einem so langen Zeitraum ja auch nicht wirklich praktikabel, da der User lediglich den Browser neu starten muss, schon hat er die Sperrzeit umgangen.

Und je länger ich mir dein Script angucke, desto weniger ergibt es Sinn. Z.B. fragst du erst ab, ob der Prüf-Zeitpunkt + 2h kleiner als der aktuelle Zeitpunkt ist, und später innerhalb der Abfrage, ob der Prüf-Zeitpunkt überhaupt gesetzt ist oO

Ich hab zwar die weiteren Rahmenbedingungen nicht zur Hand, aber ich gehe mal davon aus, dass das Script für folgendes Szenario vorgesehen ist: User loggt sich ein und soll zwei Stunden nach dem Login Zugriff auf weitere Features haben. Dann kannst du das auch insgesamt etwas verkürzen:

Zum Zeitpunkt des Logins passiert das:
PHP:
/**
 * Beim Login wird der Zeitpunkt fuer den Ablauf der Sperrzeit gespeichert
 * Der Zeitpunkt des Logins wird eigentlich nicht benötigt und dient nur der
 * Berechnung der verbleibenden Zeit, bis die Sperrfrist abgelaufen ist. 
 */
// session_start();
$_SESSION['login_time'] = time();
$_SESSION['pruef'] = time() + 7200;

Das Script, das prüft, ob die Sperrfrist noch gültig ist
PHP:
// Wenn der jetzige Zeitpunkt größer als pruef ist, ist die Sperrzeit nicht mehr gültig
if ($_SESSION['pruef'] > time()) {
    // Nachricht ausgeben
    echo 'Du bist l&auml;nger als zwei Stunden eingeloggt und hast nun Zugriff auf weitere Ressourcen!';
}
// Der User ist noch keine zwei Stunden eingeloggt
else {
    // Verbleinde Zeit ermitteln
    $time_left = round(($_SESSION['pruef'] - $_SESSION['login_time']) / 60, 0);

    // Nachricht ausgeben
    echo 'Du musst leider noch ' . $time_left . ' Minuten warten, bis Du Zugriff auf weitere Ressourcen hast.';
}
 
Danke für deine Mühen.

Aber das mit der Session ist keine Verwendung für ein Login. Das die eine Variable "..login_time..", liegt daran, dass ich mal was mit Login hatte, aber raus gekommen habe und jetzt zu faul war, es umzubenennen!

Ich habe dahingehend dein Script umgeändert bzw. angepasst:

PHP:
  $_SESSION['login_time'] = time();

  if(...) //Diese If-Abfrage soll nur aktiv sein, wenn ein Formular abgeschickt wurde ... d.h. nicht bei jedem Seitenaufruf .. daher gibt es hierfür kein ELSE
  {

  $_SESSION['pruef'] = time() + 7200;

   if(time() > $_SESSION['pruef'])
   {
//   echo 'ende session';
   }
   else
   {

$time_left = round(($_SESSION['pruef'] - $_SESSION['login_time']) / 60, 0);

echo 'Du musst leider noch ' . $time_left . ' Minuten warten';
//    if($_SESSION['pruef']=='') $_SESSION['pruef'] = time() - 7300;
//    else $_SESSION['pruef'] = $_SESSION['login_time'] + 7200;
//   echo 'session aktiv';
   }

  }

Für $time_left bekomme ich immer 120 Minuten heraus! :(

PHP:
if(time() < $_SESSION['pruef']) ....
// Ist diese Bedingung nach Absenden des Formulars erfüllt, ist man noch in der 2 Stundenfrist!
 
Jau, wie gesagt kann das doch auch gar nicht funktionieren, wenn du jedes mal vor der Überprüfung auf die Zeiten, diese neu setzt oO

Dass du immer 120 Minuten rausbekommst, liegt ganz einfach daran, dass (Jetzt + 7200s) - Jetzt = 7200s = 120min sind ;) Die beiden Zeilen dürfen so nicht im dem Script stehen, da die Session ja jedes mal überschrieben wird:
PHP:
$_SESSION['login_time'] = time();
...
$_SESSION['pruef'] = time() + 7200;
...

Die dürfen ja nur dann gesetzt werden, wenn diese entweder noch nicht vorhanden waren, oder z.B. die Zeit abgelaufen ist.
PHP:
// login_time nur setzen, wenn diese noch nicht vorhanden ist, oder gezielt
if (!isset($_SESSION['login_time']) || $_GET['action'] == 'set_login_time') {
    $_SESSION['login_time'] = time();
}

// Wenn Formular gesendet wird
if ($_POST['submit_form'] == true) {
    // pruef nur setzen, wenn diese noch nicht vorhanden ist
    if (!isset($_SESSION['pruef'])) {
        $_SESSION['pruef'] = time() + 7200;
    }

    // Sperrzeit abgelaufen
    if ($_SESSION['pruef'] < time()) {
        echo 'Du hast Zugriff';
    }
    // Sperrzeit noch nicht abgelaufen
    else {
        // Verbleibende Zeit berechnen
        $time_left = round(($_SESSION['pruef'] - $_SESSION['login_time']) / 60, 0);

        // Nachricht ausgeben            
        echo 'Du musst leider noch ' . $time_left . ' Minuten warten';
    }
}
 
Zuletzt bearbeitet:
Ich habe mir das mal ausgeben lassen. Jedesmal erhalte ich folgendes Ergebnis:

1211805906 < 1211812027 - 120

// time() < $_SESSION['pruef'] - $time_left

if($time_left < 0)

// und trotzdem geht er in den ELSE-zeig!

Ich komme mir vor, als ob ich kein PHP mehr kann, das geht doch nicht! :(
 
Poste das Script nochmal, so wie du es jetzt hast. Aus deinem letzten Post werde ich nicht wirklich schlau :/

1211805906 + 7200 = 1211813106, demnach ist 1211805906 < (1211812027 - 7200) = false. Entweder irgendwo in deinem Script steckt noch ein Fehler oder du hast statt 7200 nur 120 ins Script geschrieben. Das wären ja aber nur zwei Minuten :)
 
PHP:
 if(...) // Prüfung, ob vom Formular abgesendet
 {

  if (!isset($_SESSION['login_time'])) $_SESSION['login_time'] = time();

  if (!isset($_SESSION['pruef'])) { $_SESSION['pruef'] = time() + 7200; }

  if(time() > $_SESSION['pruef'])
  {
//   echo 'ende session';
  }
  else
  {

  $time_left = round(($_SESSION['pruef'] - $_SESSION['login_time']) / 60, 0);

echo 'Du musst leider noch ' . $time_left . ' Minuten warten';
//    if($_SESSION['pruef']=='') $_SESSION['pruef'] = time() - 7300;
//    else $_SESSION['pruef'] = $_SESSION['login_time'] + 7200;
//   echo 'session aktiv';
  }

 }


echo time().' < ';
echo $_SESSION['pruef'].' - ';
echo $time_left.'<br>';


if($time_left < 0) echo 'Noch keinen Zugriff';
 
Also, einen Fehler habe ich gefunden, den hab ich aber selber fabriziert :& richtig ist:
PHP:
 $time_left = round(($_SESSION['pruef'] - time()) / 60, 0);

Du kannst aber auch mal die letzte Zeile in folgendes ändern:
PHP:
 if(isset($time_left) && $time_left < 0) echo 'Noch keinen Zugriff';
So wird der String nur dann ausgegeben, wenn die Variable gesetzt wurde. Mit deiner Version wird der Fehler immer ausgegeben, außer du befindest dich noch innerhalb der Sperrfrist: $time_left < 0 ist wahr, wenn der Wert der Variable kleiner 0 ist oder die Variable noch gar nicht gesetzt ist. Und gesetzt wird sie ja nur, wenn man sich noch innerhalb der Sperrfrist befindet.

Mal ne andere Frage: die Session wurde auch gestartet, oder?


PS: ich hab das Script jetzt mla getestet (aber nur mit 120 Sekunden Sperrzeit) und es funktioniert. Du kannst statt round() auch ceil() verwenden, sodass aufgerundet wird und auch bei 42 verbleibenden Sekunden noch 1 Minute als verbleibend angezeigt wird.
 
Zuletzt bearbeitet:
Danke, das Script funktioniert nun.

Nur das mit ceil funktioniert nicht! ;)

EDIT:
Hier ist noch ein ganz großer Fehler drin! :(

$time_left wird immer bestückt. Das heißt, bei der If-Abfrage:

PHP:
if($time_left > 0) ...

wird er immer in die if-Abfrage rein gehen, weil $time_left hiermit immer über 1 ist! :(
 
Zuletzt bearbeitet:
Über $time_left würde ich auch gar nicht Abfragen, sondern mit den vorhandenen Variablen.
Die Zeile mit if (isseT($time_left) && ... ist ja nur zum debuggen drin. Zudem wird $time_left nur dann gesetzt, wenn man sich noch innerhalb der Sperrzeit befindet, andernfalls nicht.

Der Funktionsaufruf von ceil sähe so aus:
PHP:
$time_left = ceil(($_SESSION['pruef'] - $_SESSION['login_time']) / 60);

Siehe auch das Manual dazu.

PS: Bei Abfrage eines Wertes einer Variable, von der nicht sicher ist, dass sie zur Laufzeit erstellt wird, solltest du auch immer prüfen, ob die Variable überhaupt vorhanden ist. Das trifft in dem Script auf $time_left zu, da diese nur dann gesetzt wird, wenn man sich noch in der Sperrzeit befindet.
PHP:
// falsch
if ($time_left > 0) { ... }

// richtiger
if (isset($time_left) && $time_left > 0) { ... }
 
Zuletzt bearbeitet:
Danke Muhkuher, habe es aber anders gelöst! :)

PHP:
if (!isset($_SESSION['pruef'])) { $_SESSION['pruef'] = time() + 7200; }

Das habe ich vor der letzten if-Abfrage gesetzt. Und lasse nur nach "$time_left > 0" abfragen! So funktioniert es auch! :)
 
Zurück
Oben