2016-05-20 4 views
1

Итак, у меня есть:Как правильно начать и уничтожить сеанс?

  • index.php (логин и зарегистрировать форму, страница приветствия и т.д.)
  • login.php (это просто Войти проверить PHP-файл, который выполняется, когда пользователь нажимает кнопку отправить на index.php),
  • home.php (сайт, на котором пользователь перенаправляет после входа в систему правильно)
  • logout.php (обратная сторона login.php, перенаправляет пользователя на index.php и уничтожает сеанс (I мысль ..)

Проблема в том, что я могу получить home.php, даже до того, как я вхожу в систему правильно, в любое время. Я положил start_session() на каждую страницу, для которой нужна переменная $ _SESSION, и поставил session_destroy() в logout.php.

Так вот коды PHP-файлов которых:

index.php

<body> 

<?php 
    require_once('config.php'); 
    if ($maintanance) { 
     echo "Az oldal karbantartás alatt van."; 
    } 
    else if ($db_conn_error) { 
     echo "Something went wrong according to database connection."; 
    } 
    else { 
      include('reg.php'); 
      include('./templates/header.php'); 
?> 

    <section> 
     <form id="login_form" action="" method="POST"> 
      <h2>Already a member? Sign in!</h2> 
      <p>Username: <input type="text" name="username"></p> 
      <p>Password: <input type="password" name="password"></p> 
      <input type="submit" name="login_submit" value="Sign In"> 
      <?php include 'login.php'; ?> 
     </form> 

     <form id="reg_form" action="" method="POST" onsubmit="return validation();"> 
      <h2>Sign up Now!</h2> 
      <p>Username: <input type="text" name="username" placeholder="min. 5 characters"> 
      <span id="user_error"></span> 
      </p> 
      <p>Password: <input type="password" name="password" placeholder="min. 8 characters"></p> 
      <p>Password again: <input type="password" name="password_again"></p> 
      <p>E-mail: <input type="email" name="email" size="30"></p> 
      <p>Date of birthday: 
       <input type="number" name="bd_year" min="1950" max="2016"> 
       <input type="number" name="bd_month" min="1" max="12"> 
       <input type="number" name="bd_day" min="1" max="31"> 
      </p> 
      <input type="submit" name="reg_submit" value="Sign Up"> 
     </form> 
    </section> 
</body> 
</html> 
<?php } ?> 

login.php

<?php 

    include 'config.php'; 

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

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

     $query = "SELECT username, hashed_password FROM users WHERE username = '$username';"; 

     $result = mysqli_query($conn, $query); 
     $row = mysqli_fetch_assoc($result); 
     $rows_num = mysqli_num_rows($result); 

     $password_match_error_message = false; 

     if ($rows_num == 0) { 
      echo "<p class='login_error_msg'>This user doesn't exist!</p>"; 
     } 
     else { 
      $password_match = password_verify($password, $row['hashed_password']); 
      if (!$password_match) { 
       echo "<p class='login_error_msg'>Wrong password!</p>"; 
      } 
      else { 
       session_start(); 
       $_SESSION["user"] = $username; 
       header("Location: home.php"); 
      } 
     } 
    } 

?> 

home.php

<?php 
    session_start(); 
    if (isset($_SESSION["user"])) { 
?> 

<!DOCTYPE html> 

<html> 

<head> 
    <title>Spookie - Social Network</title> 
    <link rel="stylesheet" type="text/css" href="./css/style.css"> 
</head> 

<body> 

    <?php 
     include './templates/header.php'; 
    ?> 

    <?php } else { echo "You are not logged in!"; } ?> 

</body> 

</html> 

logout.php

<?php 
    session_unset($_SESSION["user"]); 
    session_destroy(); 
    header("Location: index.php"); 
?> 

Я знаю, это трудно понять, что происходит на самом деле с помощью кодов, на вход работает, но сессия не реально.

Проблема: я печатаю и home.php всегда доступен, несмотря на то, что я не вошел в систему. Logout.php не уничтожает сеанс или даже сеанс не может быть запущен.

Большое вам спасибо за помощь! :)

+1

вашего home.php необходим этот фильтр внутри тела, а не перед DOCTYPE, если вы хотите, чтобы делать то, что он выглядит как вы хотите сделать (т. е. создать страницу, но с фильтрованным контентом). Тем не менее: что вы на самом деле возвращаете, когда вы посещаете эту страницу без сеанса, например, используя cURL или wget? Пожалуйста, обновите свой пост доказательством того, что что-то идет не так, чтобы мы могли знать, что вы знаете, прежде чем пытаться ответить на это. –

ответ

1

Проблема в logout.php.

Вы также должны требовать session_start(), чтобы обеспечить вас CAN удалить переменную $_SESSION["user"].

Возможны другие проблемы, так как я не вижу весь код.Поправьте меня, если я ошибаюсь.

Посмотрите на другой ответ, который объясняет типичный способ установки переменных сеанса

+0

О, боже, спасибо большое! Да, я поставил session_start() на logout.php, и он, наконец, работает! :) – Gallion

0

Согласно этой инструкции: http://php.net/manual/en/function.session-destroy.php

Для того, чтобы убить сессию в целом, как для входа пользователя вне, идентификатор сессии должен быть снят с охраной. Если cookie используется для распространения идентификатора сеанса (поведение по умолчанию), тогда cookie сеанса должен быть удален . Для этого может использоваться setcookie().

В руководстве есть полный рабочий пример о том, как это сделать. Украденное оттуда:

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 
?> 
0

session_start() начнет сеанс.

session_destroy() уничтожит сеанс.

Для настройки данных сеанса вы можете это сделать.

` 
    $_SESSION['is_logged_in'] = true; 
` 

ДЛЯ ПРОВЕРКИ СУЩЕСТВОВАНИЯ СЕССИИ или проверить, если пользователь вошел в системе

` 
    If(isset($_SESSION['is_logged_in']) {} 
    else { 
    //redirect to login page 
    } 
`