2011-11-20 110 views
0

我想不通,爲什麼下面的PHP將無法正常工作:簡單的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已設置」消息是否正確?但我只收到「LoggedIn未設置」的消息。

我知道,在會話開始和的loggedIn設置正確,但我似乎失去了變數,當我刷新頁面,或使用的形式,這是不應該的,因爲它是一個會話變量嗎?

我是新來使用他們,所以任何幫助,將不勝感激。

+0

你應該真的改變你的MySQL密碼!並且md5()不再安全,請使用sha1()和隨機salt! – CodeZombie

回答

0

如果你想讀的$ _SESSION全局的,你必須開始一個會話。即必須調用session_start();。登錄時,您可能需要啓動兩次:一次是爲用戶的驗證,並做一些像$_SESSION['status'] = 'authorized';那麼通常你創建header('Location : somewhere');重定向我沒有專業的header()功能,但我知道後,你必須做如果要從$_SESSION全局變量中讀取,請再次輸入session_start()

+0

哦謝謝你,兩個答案都有幫助,但你的幫助我瞭解真正的問題,我不能如果會話尚未啓動,請閱讀會話變量以檢查是否已設置。使用session_id ==「」檢查是對我的問題更好的解決方案。謝謝大家回答:) – TonyArra

3

在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

我試過,因爲你可以看到在更新的代碼,但它似乎仍然刪除會話變量,我不知道爲什麼 – TonyArra