2012-02-28 4 views
0

На этот раз мне нужна ваша помощь в чем-то, связанном с php. Сценарий моих пользователей работает не так, как ожидалось, он должен регистрироваться в течение 3 недель, но это просто не удается, после менее чем 60 минут сеанс уничтожается, и мне нужно снова войти в систему, любое предложение?PHP Сессии не работают

Мой код:

<?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; 
     } 



?> 

Спасибо!

PS: В качестве дополнительных данных это общий сервер.

+0

Зачем вам делать этот код в цикле while? – dqhendricks

+0

@ dqhendricks в цикле? Извините, но нет цикла, возможно, вы это говорите, потому что он сначала ищет, если он пользователь, а затем выполняет поиск, если это электронная почта. – Luis

+0

Нет, я говорю об этой строке ... 'while ($ row = mysql_fetch_array ($ result)) {' – dqhendricks

ответ

1

Посмотрите на session.gc_maxlifetime в /etc/php5/apache2/php.ini

Либо обновить его там, или попробовать положить ini_set('session.gc_maxlifetime', 60*60*24*7*3); в сценарий в верхней

Увеличить что-то большее

в основном, это то, как долго сервер ожидает перед удалением файлов сессий

+0

Общий хостинг, любое предложение? – Luis

+0

вы можете попробовать запустить 'ini_set ('session.gc_maxlifetime', 60 * 60 * 24 * 7 * 3);' – Ascherer

+0

или попросить вашего хостинг-провайдера изменить это значение. – Ascherer

1

Вам нужно будет использовать куки для поддержки remember me типа поведения. Когда сеанс уничтожается на сервере, cookie должен действовать как катализатор для запуска нового сеанса как одного и того же пользователя, когда они повторно посещают ваш сайт и автоматически записывают их в очередь за кулисами.

Поиск в Google возвращает некоторые довольно хорошие результаты, в первую очередь reference в фактический код файла cookie (поиск autologin.php).

+0

Я попытался сделать это один раз, и я никогда не смог заставить его работать должным образом. – Ascherer

+0

@ Ascherer, я сделал и, похоже, работает лучше, ожидая результатов. – Luis

+0

Майк, спасибо! Я не знал этого, я думал, что файлы cookie и сеансы были одинаковыми, теперь они работают с этим, ожидая завтра, чтобы принять лучший ответ. Благодаря! – Luis

0

Обычно люди используют session_set_cookie_params(), чтобы изменить время жизни файла cookie сеанса. и вы должны установить это до того, как будет вызван первый session_start(). по умолчанию обычно установлено значение 0 (например, когда пользователь закрывает окно браузера).

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

вам также потребуется изменить максимальный срок службы сбора мусора для файлов сеансов. перед началом сеанса попробуйте:

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

Есть ли способ проверить, были ли файлы cookie и сеансы установлены успешно ПОСЛЕ входа в систему? Как сеансы исторические в браузере? – Luis

Смежные вопросы