2013-06-18 3 views
0

Я пытаюсь создать систему, в которой, когда пользователь неактивен в течение x времени, они должны быть выведены из системы и отправлены обратно в 'index.php'. Я использую код, который я нашел здесь - http://cookbooks.adobe.com/post_Set_a_time_limit_on_a_login_session__PHP_-16701.html и я положил его в функцию, как это:система неактивности и входа php

phpfunc/inactivity.php

<?php 

function inactivity() { 
    // create a session 
    if (!isset($_SESSION)) { 
     session_start(); 
    } 

    // store the current time 
    $now = time(); 

    // get the time the session should have expired 
    $limit = $now - 60*20; 

    // check the time of the last activity 
    if (isset ($_SESSION['last_activity']) && $_SESSION['last_activity'] < $limit) { 
     // if too old, clear the session array and redirect 
     $_SESSION = array(); 
     header('../index.php'); 
     exit; 
    } 
    else { 
     // otherwise, set the value to the current time 
     $_SESSION['last_activity'] = $now; 
    } 
} 

?> 

Затем я вызываю функцию, как это ... в верхней моей защищенной странице

шаблоны/login_success.php:

<?php 
require('/Users/Eamon/Sites/phpfunc/inactivity.php'); 
inactivity(); 

if($_SESSION['username'] === null){ 
    header("location: ../index.php"); 
} 
?> 

<h1>Login Successful</h1> 
<h2>Username: <? echo $_SESSION['username']?></h2> 
<div id="logoutlinkdiv" > 
    <a href = "#" >Log out</a> 
</div> 

Я могу войти - и все пассивность вещи, кажется, работает. Я протестировал его, добавив несколько инструкций эха здесь и там ... и после входа в систему я попытался перейти на защищенную страницу - вроде этого «localhost/~ Eamon/templates/login_success.php», и это позволяет мне видеть это ... после 20 минут мне нужно снова войти в систему. Тем не менее, у меня есть страница, которая загружается после выхода пользователя из системы (после нажатия ссылки «logoutlinkdiv») - и у нее есть ссылка на нее для входа в систему снова. Когда я нажимаю на эту ссылку, я получаю сообщение «Неправильное имя пользователя или пароль», которое можно найти в следующем файле (который запускается при входе в систему). Через 20 минут я могу снова войти в систему, не получив эту ошибку.

checklogin.php

<?php 

session_start(); 

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="bonjour3"; // Mysql password 
$db_name="itit"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
$mysqli = new mysqli("$host", "$username", "$password", "$db_name")or die("cannot connect"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

$sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=? and password=?"); 
$sql->bind_param('ss',$myusername,$mypassword); 
$sql->execute(); 
$sql->store_result();//apply to prepare statement 
$numRows = $sql->num_rows; 

if($numRows === 1){ 
    $_SESSION['username'] = $myusername; 
} 
else { 
    echo "Wrong Username or Password"; 
    session_destroy(); 
} 
?> 

Вот вышеупомянутая страница выхода из системы (где пользователь может войти в систему снова ... страницу неприятности!):

шаблоны/logout.php

<?php 
session_start(); 
session_destroy(); 
?> 

<div id="loginlinkdiv" > 
    <h2>You have been logged out.</h2> 
    <a href = "#">Log in</a> 
</div> 

В случае, если это релевантно ... вот jquery, который я использую. Я, сделав SPA - так JQuery загружается и опорожнение вещи для меня в "главном" DIV на index.php - здесь:

index.php

<?php session_start(); ?> 

<!DOCTYPE html> 
<html> 
<head> 
<title>it IT</title> 
    <script src="reqscripts/jquery.js" type="text/javascript"></script> 
    <script src="js/application.js" type="text/javascript"></script> 
</head> 
<body> 
    <div id="main"></div> 
</body> 
</html> 

UPDATE

После предложение - я попробовал первый ответ на этой странице:

How do I expire a PHP session after 30 minutes?

я изменил два файла.

phpfunc/inactivity.php теперь выглядит следующим образом:

<?php 

function inactivity() { 

    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) { 
     // last request was more than 30 minutes ago 
     session_unset();  // unset $_SESSION variable for the run-time 
     session_destroy(); // destroy session data in storage 
     header("/Users/Eamon/Sites/index.php"); 
    } 

    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp 
} 

?> 

и шаблоны/login_success.php выглядит следующим образом:

<?php 
require('/Users/Eamon/Sites/phpfunc/inactivity.php'); 
session_start(); 
inactivity(); 
?> 

<h1>Login Successful</h1> 
<h2>Username: <? echo $_SESSION['username']?></h2> 
<div id="logoutlinkdiv" > 
    <a href = "#" >Log out</a> 
</div> 

Все та же проблема, как представляется, происходит ... и Думаю, я поймал новый сбой. Когда я нажимаю ссылку для входа (templates/logout.php), она приводит меня к index.php. Я пытаюсь войти в систему, но информация в текстовых окнах перезагружается, и, похоже, ничего не происходит. Когда я снова попробую - снова получаю «Неправильное имя пользователя или пароль». Также - <? echo $_SESSION['username']?> больше не отображается на странице login_success.php.

UPDATE

Кажется, как будто я не получаю, потому что подписал в <? echo $_SESSION['username']?> еще не делает ничего на выходе.

+0

Почему наклоняю вы просто установить его в php.ini или HTAccess: http://www.php.net/manual/en/session.configuration.php#ini.session. gc-maxlifetime (директива 'session.gc-maxlifetime')? Намного проще! – jtheman

+0

Возможный дубликат http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes –

+0

@jtheman благодарит за то, что указал мне в правильном направлении - только то, что я необходимо. – ewizard

ответ

0

Вариант один:

использование session.gc_maxlifetime

ini_set('session.cookie_lifetime', 600); 
session_start(); 

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

Это значение (по умолчанию 1440 секунд) определяет, как долго неиспользуемый PHP сессии будет храниться в живых. Например: пользователь входит в систему, просматривает ваше приложение или веб-сайт часами, в течение нескольких дней. Нет проблем. Пока время между его кликами никогда не превышает 1440 секунд. Это значение тайм-аута.

вариант два:

session.cookie_lifetime

Это значение (по умолчанию 0, что означает, до следующего перезапуска браузера) определяет, как долго (в секундах) куки сессии будет жить. Похоже на session.gc_maxlifetime, но это совершенно другой подход. Это значение косвенно определяет «абсолютное» максимальное время жизни сеанса, независимо от того, активен он или нет. Если для этого значения установлено значение 60, каждая сессия заканчивается через час в минуту.

Вариант третий:

session_start(); 
// set time-out period (in seconds) 
$inactive = 600; 

// check to see if $_SESSION["timeout"] is set 
if (isset($_SESSION["timeout"])) { 
    // calculate the session's "time to live" 
    $sessionTTL = time() - $_SESSION["timeout"]; 

    if ($sessionTTL > $inactive) { 
     session_destroy(); 
     header("Location: /logout.php"); 
    } 
} 

$_SESSION["timeout"] = time(); 
+0

Вы читали это: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes – jtheman

+0

@ user1752647 Я думаю, что u означает это 'ini_set ('session .gc-maxlifetime ', 60 * 30); 'not this' ini_set (' session.cookie_lifetime ', 600); ' – ewizard

+0

@jtheman, где я могу поставить' ini_set (' session.gc-maxlifetime ', 60 * 30); '? – ewizard

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