2016-05-28 2 views
1

Привет, я создал систему входа в систему, но по какой-то причине она не работает, я запускаю сеанс после некоторого входа в систему, а затем сделал чек, если сеанс isetet, и если сеанс не более 1 часа:Сессия не работает

это мой сценарий Войти на index.php:

<?php 
require 'mysql.php'; 

if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ 
    session_start(); 
    session_unset(); 
    session_destroy(); 

} 

if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] < 3600){ 
    header('Location: main.php'); 
} 



if (isset($_POST["login"])){ 

    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $stmt = $connect->prepare("SELECT username, password FROM users WHERE username=? "); 
    $stmt->bind_param("s", $username); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $rowcount = $result->num_rows; 
     if ($rowcount > 0){ 

       while ($row = $result->fetch_assoc()) { 
        if ($row["username"] == $username && $row["password"] == $password){ 

         if(!isset($_SESSION)) { 
          session_start(); 
         } 
          $_SESSION["username"] = $username; 
          $_SESSION["usertype"] = $row["usertype"]; 
          $_SESSION["userid"] = $row["id"]; 
          $_SESSION["CREATED"] = time(); 
         header('Location: main.php'); 

        } else { 
         $error_msg2 = "Username or password does not mach"; 
         $error2 = "error"; 
        } 
       } 
     } else { 
      $error_msg2 = "No such user"; 
      $error2 = "error"; 
     } 

    echo $error_msg2; 
    $stmt->close(); 
    $connect->close(); 

} 

?> 

и это main.php код:

if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ 
    session_start(); 
    session_unset(); 
    session_destroy(); 
    header('Location: index.php'); 
} 

так те, что вы войти вы будете перенаправлены от main.php и если сессия установлены u shou ld не сможет получить доступ к index.php, потому что если вы попробуете u и сеанс не истекли, вы получите перенаправленный обратно main.php, то с main, если сессия истекла, вы будете перенаправлены обратно в index.php для входа в систему, но неважно если вы вошли в систему или нет, вы можете свободно ходить между ними.

+1

начать сеанс вне если условия. –

+0

@FrayneKonok согласился. и уничтожить его с вашим состоянием. –

+0

то же самое, и я знаю, что код хорош, несмотря на то, что я вошел в систему, и получил перенаправление на главную.php, поэтому он должен пройти весь предыдущий ожидаемый код и начать сеанс – yahoo5000

ответ

1

Вы должны позвонить по номеру session_start в любом случае - это заполняет $_SESSION со значениями. Также достаточно отключить $_SESSION['username'], не нужно уничтожать целую сессию - PHP может позаботиться об этом. Вот код, который должен работать:

index.php

<?php 
require 'mysql.php'; 

session_start(); 
if (isset($_SESSION['username'])) { 
    if ($_SESSION['CREATED'] < 3600) { 
     header('Location: main.php'); 
     exit; 
    } 

    unset($_SESSION['username']); 
} 


if (isset($_POST['username']) && isset($_POST['password'])) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $stmt = $connect->prepare('SELECT username, password FROM users WHERE username=? LIMIT 1'); 
    $stmt->bind_param('s', $username); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $rowcount = $result->num_rows; 

    if ($rowcount > 0) { 
     $row = $result->fetch_assoc(); 

     if ($row['username'] == $username && $row['password'] == $password) { 
      $_SESSION['username'] = $username; 
      $_SESSION['usertype'] = $row['usertype']; 
      $_SESSION['userid'] = $row['id']; 
      $_SESSION['CREATED'] = time(); 

      header('Location: main.php'); 
      exit; 
     } else { 
      $error_msg2 = 'Username or password does not mach'; 
      $error2 = 'error'; 
     } 
    } else { 
     $error_msg2 = 'No such user'; 
     $error2 = 'error'; 
    } 

    echo $error_msg2; 
    $stmt->close(); 
    $connect->close(); 
} 

main.php

session_start(); 
if (!isset($_SESSION['username']) || time() - $_SESSION['CREATED'] > 3600){ 
    unset($_SESSION['username']); 
    header('Location: index.php'); 
    exit; 
} 
+0

, поэтому мне нужно установить только переменные some1 login? сеанс может работать в любое время, даже если переменные не являются isset? – yahoo5000

+1

Пожалуйста, используйте [session_write_close] (http://php.net/manual/en/function.session-write-close.php), когда переменная '$ _SESSION' больше не используется. Это используется для разблокировки сеанса для одновременной записи. – dbf

+0

Не используйте $ _SESSION перед session_start. Это может иметь непредсказуемые результаты. – luchaninov

1

Прежде чем вы сможете использовать $ _SESSION, вам нужно позвонить session_start().

<?php 
require 'mysql.php'; 
session_start(); 

if(isset($_SESSION["username"]) && time() - $_SESSION["CREATED"] > 3600){ 

    session_unset(); 
    session_destroy(); 
} 
+0

сначала проверьте мой сценарий входа в систему – yahoo5000

+0

В любое время, когда вы хотите получить доступ к $ _SESSION, вам нужно сначала вызвать session_start(), поэтому вам придется обновите как ваш логин, так и основные скрипты php. http://php.net/manual/en/function.session-start.php –

1

У меня есть предложение. Создайте функцию проверки сеанса.

function sessionValidate($username,$id=NULL) 
{ 
    $status = session_status(); 

    if($status == PHP_SESSION_NONE) 
    { 
     //There is no active session 
     session_start(); 
    } 


    if(!isset($_SESSION[$username])) 
    { 

     return false; 
    } 

    $id = $_SESSION[$roleid]; 

    if((time()- $_SESSION["created"]) >= 3600) 
    { 
     session_destroy(); 
     return false; 
    } 


    return $id; 
} 

и проверьте его на каждой странице или используйте его на титульной странице.

if(!($userid=sessionValidate($username))) 
{ 
    error_log("No session logging out ...."); 
    header('Location: index.php'); 
} 

UPDATE ::

Определение

session_status - возвращает текущее состояние сеанса

Возвращаемые значения

PHP_SESSION_DISABLED - если сеансы отключены.

PHP_SESSION_NONE - если сеансы включены, но не существует.

PHP_SESSION_ACTIVE - если сеансы включены, а один существует.

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