2012-02-28 2 views
0

Cette fois, j'ai besoin de votre aide pour quelque chose en rapport avec php. Mon script utilisateurs ne fonctionne pas comme prévu, il est censé rester connecté dans 3 semaines mais cela échoue juste, après moins de 60 minutes, la session est détruite et je dois me connecter à nouveau, une suggestion?Les sessions PHP ne fonctionnent pas

Mon code:

<?php 
if (!isset($_SESSION)) session_start(); 

mysql_connect("YOU", "DONT", "NEED") or die("database connection failed"); 
mysql_select_db("THIS!!!") or die("database selection failed"); 

$user = $_POST['username']; 
$pass = $_POST['password']; 
$remember = $_POST['remember']; 

$token = $_POST['login-token']; 
$error; 

     if(isset($_SESSION['username'])) { 
      $error = $error." :erlgd:"; 
     } 
     if(empty($user)){ 
      $error = $error." :erusr:"; 
     } 
     if(empty($pass)){ 
      $error = $error." :erpwd:"; 
     } else 
     $password = md5($pass); 

     if(empty($error)){ 
      $sql = "SELECT * FROM login_users WHERE username='$user' AND password='$password'"; 
      $result = mysql_query($sql); 
      $count = mysql_num_rows($result); 
      if($count == 0){ 
       $sql = "SELECT * FROM login_users WHERE email='$user' AND password='$password'"; 
       $result = mysql_query($sql); 
       $count = mysql_num_rows($result); 
       if($count == 0){ 
        $error = $error.":erwrg:"; 
       } 
      } 

     } 


    // Once everything's filled out 


     // Just double check there are no errors first 
     if($error == '') { 
      while($row = mysql_fetch_array($result)) { 
       $minutes = 10080; 

       if($minutes == 0) 
        ini_set('sesion.cookie_lifetime', 0); 
       else 
        ini_set('session.cookie_lifetime', 60 * $minutes); 
       session_regenerate_id(); 

       $sql = "SELECT * FROM login_activate WHERE username='$user'"; 
       $count = mysql_num_rows(mysql_query($sql)); 
       if ($count > 0) 
        $_SESSION['activate'] = 1; 
       else 
        $_SESSION['activate'] = 0; 

       $_SESSION['restricted'] = $row['restricted']; 
       $_SESSION['name'] = $row['name']; 
       $user_level = unserialize($row['user_level']); 
       $_SESSION['user_level'] = $user_level; 
       $sql = "SELECT level_disabled FROM login_levels WHERE level_level = '$user_level'"; 
       $disRow = mysql_fetch_array(mysql_query($sql)); 
       $_SESSION['level_disabled'] = $disRow['level_disabled']; 

       if(!empty($remember)) { 
        ini_set('session.cookie_lifetime', 60*60*24*100); // Set to expire in 3 months & 10 days 
        session_regenerate_id(); 
} 
       // And our magic happens here ! Let's sign them in 
       $_SESSION['username'] = $row['username']; 

       unset($_SESSION['token']); 
       echo "success"; 
       // Redirect after it's all said and done 

      } 

     }else{ 
      echo "error:".$error; 
     } 



?> 

Merci! PS: En tant que données supplémentaires, il s'agit d'un serveur partagé.

+0

pourquoi voudriez-vous faire ce code dans une boucle while? – dqhendricks

+0

@dqhendricks dans une boucle? Je suis désolé mais il n'y a pas de boucle, peut-être que vous le dites parce qu'il cherche d'abord s'il s'agit d'un utilisateur et recherche plus tard s'il s'agit d'un e-mail. – Luis

+0

non je parle de cette ligne ... 'while ($ row = mysql_fetch_array ($ result)) {' – dqhendricks

Répondre

1

Jetez un oeil à la session.gc_maxlifetime dans /etc/php5/apache2/php.ini

soit mettre à jour là, ou essayer de mettre ini_set('session.gc_maxlifetime', 60*60*24*7*3); dans votre script en haut

Augmenter que quelque chose

plus

essentiellement, c'est combien de temps le serveur attend avant d'effacer les fichiers de session

+0

Hébergement mutualisé, une suggestion? – Luis

+0

vous pourriez essayer d'exécuter 'ini_set ('session.gc_maxlifetime', 60 * 60 * 24 * 7 * 3);' – Ascherer

+0

ou demander à votre fournisseur d'hébergement de changer cette valeur – Ascherer

1

Vous devrez utiliser des cookies pour soutenir le type de comportement remember me. Lorsqu'une session est détruite sur le serveur, le cookie est censé agir comme un catalyseur pour démarrer une nouvelle session en tant que même utilisateur, quand ils visitent à nouveau votre site, et les connecte automatiquement, dans les coulisses.

Une recherche Google renvoie d'assez bons résultats, notamment un reference au code de cookie réel (recherche de autologin.php).

+0

J'ai essayé de le faire une fois, et je ne pourrais jamais le faire fonctionner correctement .... – Ascherer

+0

@Ascherer, je l'ai fait et il semble fonctionner un peu mieux, en attendant les résultats. – Luis

+0

Mike, merci! Je ne le savais pas, je pensais que les cookies et les sessions étaient les mêmes, travaillant maintenant avec ça, attendant demain pour accepter la meilleure réponse. Merci! – Luis

0

En général, les utilisateurs utilisent session_set_cookie_params() pour modifier la durée de vie d'un cookie de session. et vous devriez mettre ceci avant que le premier session_start() soit appelé je crois. la valeur par défaut est généralement 0 (alias lorsque l'utilisateur ferme la fenêtre du navigateur).

http://www.php.net/manual/en/function.session-set-cookie-params.php

vous aurez également besoin de changer la collecte des ordures durée de vie maximale pour les fichiers de session. avant que votre session commence, essayez:

ini_set(’session.gc_maxlifetime’, $lifetime_in_seconds); 
+0

Existe-t-il un moyen de voir si les cookies et les sessions ont été correctement configurés APRÈS la connexion? Comme une session historique dans le navigateur? – Luis

Questions connexes