Простые переменные PHP-сессии - PullRequest
0 голосов
/ 20 ноября 2011

Я не могу понять, почему следующий PHP не будет работать должным образом:

 <?php
  //Authenticate user credentials
  function authenticate($name, $password) {
    $sql = "SELECT * 
        FROM users 
        WHERE username = '$name' 
        AND password = '" . md5($password) . "'";
    $result = mysql_query($sql);
    if ($row = mysql_fetch_array($result)) {
      //Successful login
      echo "Welcome back, " . $row['username'] . "!";
      return true;
    } else {
      //Failed login
      echo "Invalid username or password";
      return false;
    }
  }

  function addUser($name, $password) {
    $sql = "INSERT 
        INTO users (username, role, password) 
        VALUES ('$name', 'CHAIR', '". md5($password) . "');";
    mysql_query($sql);
  }

  function createTables() {
    $sql = "CREATE TABLE Users (
       Create table Users(
       username varchar(50) NOT NULL,
       role ENUM('CHAIR', 'FACULTY', 'STAFF') NOT NULL,
       password varchar(255) NOT NULL,
       email varchar(50)  NOT NULL PRIMARY KEY,
       applicant_client_id varchar(50) NOT NULL,
       countries varchar(50),
       research_area varchar(255),
       numAssignedReviews TINYINT UNSIGNED,
       available varchar(50),
       workload FLOAT UNSIGNED
       );"
    ;
    mysql_query($sql);
  }

  session_start();
  if (isset($_SESSION['loggedIn'])) {
    echo '<script> alert("LoggedIn is set") </script>';
    $con = mysql_connect("localhost", "ttony21_Tony", "cse308");
    if (!$con) {
      die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("ttony21_GARS", $con);

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

    if (authenticate($name, $password)) {
      $_SESSION['loggedIn'] = true;
    } 

    mysql_close($con);
  } else {
    $_SESSION['loggedIn'] = false;
    echo '<script> alert("LoggedIn is not set") </script>';
  }
?>
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>GARS</title>
    <style type="text/css">
      body {
        text-align: center;
        min-width: 600px;
      }
      #wrapper {
        margin: 0 auto;
        width: 600px;
        text-align: left;
      }
    </style>
    <script type="text/javascript" src="jquery.js"></script>
    </head>
  <body>
    <div class = "wrapper">
      <?php
        if ($_SESSION['loggedIn']) {
          echo '
            <div class = "upload">
              <form action="upload_file.php" method="post" enctype="multipart/form-data">
                <label for="file">Filename:</label>
                <input type="file" name="file" id="file" /> 
                <br />
                <input type="submit" name="submit" value="Submit" />
              </form>
            </div>
            ';
        } else {
          echo '
            <div class = "login">
              <form action = "/" id = "loginForm" method = "post">
                <p>
                  Username: <input type = "text" name = "name" /> 
                  <br />
                  Password: <input type = "password" name = "password" /> 
                  <br />
                  <input type = "submit" id= "submit"/>
                </p>
              </form>
            </div>
          ';
        }
      ?>
    </div>
  </body>
</html>

Есть форма: <form action = "/" id = "loginForm" method = "post">

Когда я либо отправляю форму, либо обновляю страницу, она должна предупредить меня с сообщением "Вход в систему установлен" правильно? Но я получаю только сообщение «Вход в систему не установлен».

Я знаю, что сеанс начинается, и loggedIn установлен правильно, но, похоже, я теряю переменную при обновлении страницы или использовании формы, что не должно происходить, потому что это переменная сеанса, верно?

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

Ответы [ 3 ]

3 голосов
/ 20 ноября 2011

Session_Start () должен быть перед оператором if, а не в остальной части.

<?php 
session_start();
if (isset($_SESSION['loggedIn'])) {
    echo '<script> alert("LoggedIn is set") </script>';
    ...
  } else {
    $_SESSION['loggedIn'] = false;
    echo '<script> alert("LoggedIn is not set") </script>';
  }
?>

Я бы немного изменил это, чтобы уточнить, что session_start () должен быть в самом начале страницы, перед тем, как выводится какой-либо HTML. После вывода HTML сеанс не начнется.

0 голосов
/ 20 ноября 2011

Если вы хотите прочитать глобальную переменную $ _SESSION, вы должны начать сеанс. то есть session_start(); должно быть вызвано. При входе в систему вам может потребоваться запустить его два раза: один раз для проверки пользователя и сделать что-то вроде $_SESSION['status'] = 'authorized'; Затем, как правило, вы создаете перенаправление с header('Location : somewhere'); Я не профессионал в функции header(), но я знаю что после него вы должны сделать session_start() еще раз, если хотите прочитать из глобальной переменной $_SESSION.

0 голосов
/ 20 ноября 2011

С http://php.net/manual/en/function.session-start.php

session_start() creates a session or resumes the current one based on a session identifier passed via a GET or POST request, or passed via a cookie.

Поэтому вам необходимо вызывать session_start при каждом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...