2015-07-12 117 views
3

我遇到了2個文件的問題:login_config.phpprofile.php會話變量不起作用? (PHP)

  • login_config.php由日誌系統,它設置$ _SESSION [「鑰匙」]真正的幾種驗證完成後的。
  • profile.php是用戶在成功後重定向到的頁面。

我希望profile.php上的數據只能使用$ _SESSION ['key'] set(成功登錄時)訪問。

我的問題:我的代碼有什麼不正確?此外,爲什麼我在提交登錄時出現錯誤,只有在$ _SESSION ['key']爲false /未設置時纔會返回,與目標profile.php頁面相反?

CODE:(login_config.php)

<?php 

// POST VARIABLES 
$submit = $_POST['login_submit']; 
$username = $_POST['login_username']; 
$password = $_POST['login_password']; 
$email = $_POST['login_email']; 

require 'password_config.php'; 

if(isset($submit)){ 

    require 'db/connect.php'; 

    // PASSWORD VERIFYING 
    $pass_query = "SELECT password FROM users WHERE email='$email'"; 
    $queried = mysql_query($pass_query); 
    while($row = mysql_fetch_array($queried)){ 
     $user_pass = $row['password']; 
     $veri_password = password_verify($password, $user_pass); 
    } 
    if(!$veri_password === true){$errors[] = '-Account does not exist ';} 

    // CHECKING NUM ROWS 
    $sql = "SELECT id, username FROM users WHERE password='$user_pass' AND email='$email'"; 
    $entered_user = mysql_query($sql); 
    $num_rows = mysql_num_rows($entered_user); 


    // ERRS ARRAY ESTABLISHED 
    $errors = array(); 

    // FURTHER VERIFYING 
    if(empty($password) || empty($email)) 
    { 
     $errors[] = 'Please do not leave fields empty'; 
    } 
    elseif($num_rows != 1) 
    { 
     $errors[] = '-Account does not exist '; 
    } 
    elseif($num_rows == 1) 
    { 
     session_start(); 
     $_SESSION['key'] === true; 

     while($row = mysql_fetch_array($entered_user)){ 
      $_SESSION['id'] = $row['id']; 
      $_SESSION['email'] = $email; 
      $_SESSION['user'] = $row['username']; 
      $_SESSION['pass'] = $password; 
      header('Location: profile.php'); 
      exit(); 
     } 

    } 
} 

CODE:(profile.php)

<?php 

session_start(); 

if($_SESSION['key'] !== true){ 
    die ("please <a href='login.php'>log in</a> to view this page"); 
} 
?> 
<html> 
<head> 
    <title>Profile</title> 
    <link href='css/main.css' rel='stylesheet' /> 
</head> 
<body> 
    <div id='container'> 
     <?php require 'include/header.php'; ?> 
     <?= 'NJM ID # ==>'.$_SESSION['id'].'<br />'.'Username ==>'.$_SESSION['user'].'<br/>'.'Password ==>'.$_SESSION['pass'].'<br/>'.'<br />' ?> 
     <a href='logout.php'>Log out!</a> 
     <br /> 
     -OR- 
     <br /> 
     <p>Try our beta mode<a href='forum.php'> forum</a></p> 
     <?php require 'include/footer.php'; ?> 
    </div> 
</body> 
</html> 

注:我知道我很容易受到SQL攻擊的代碼的當前狀態,我將在稍後解決這個問題,同時我也堅持不推薦使用MySQL。

+0

此外,在此先感謝您的幫助-Eugene –

+0

不能完全確定爲什麼這個問題已經下來了投票。仍然沒有收到解決方案。 –

+2

你可以縮進你的代碼,並更具體地說明你得到的是哪個錯誤。註釋你的代碼以顯示邏輯失敗的位置,以及你期望看到/你實際看到的是什麼 –

回答

4

profile.php你必須在使用$_SESSION之前致電session_start();session_start()不只是開始一個新的會話,而且還會繼續現有的會話(如果您願意的話,它將「啓動」會話處理功能)。不調用它,你不能使用$_SESSION

+0

嘗試和編輯的代碼,問題仍然存在。 –

0

在嘗試到下一個PHP頁面之後,我會先嚐試刪除exit()調用。這是沒有必要的,因爲你沒有下面的代碼,它可能會影響會議(我不這麼認爲)

如果這不起作用(可能不會)添加到profile.php後啓動會話var_dump($_SESSION)並查看/發佈其內容。

+0

下面是var_dump($ _ SESSION):array(5){[「id」] => string(2)「89」[「email」] => string(8)「uyuyuyuy」[「user」]的結果=> string(8)「uyuyuyuy」[「pass」] => string(10)「uyuyuyuyuy」[「username」] => string(8)「uyuyuyuy」}請登錄後再查看此頁 –

+0

想加入這是一個隨機的交易 –

+0

是的,你的問題是顯而易見的 - 在會話中沒有任何鑰匙叫'鑰匙' –

0

我已經通過給$ _SESSION ['key']賦值一個變量來解決這個問題。

$_SESSION['key'] = $check = 'check'; 

然後在profile.php測試這一點,我已經進入了下面的代碼:

if(isset(!$_SESSION['key'])){die ('example')} 
1

月1日:我會用termary運營商檢查我所需要的價值的存在,以避免「未定義索引'login_username'」錯誤。像這樣:

$username = isset($_POST['login_username']) ? $_POST['login_username'] : ''; 
$password = isset($_POST['login_password']) ? $_POST['login_password']) : ''; 
$email = isset($_POST['login_email']) ? $_POST['login_email'] : ''; 

第二:我會使用PDO連接MySQL服務器,出於安全原因,而不僅僅是。

session_start(); 

if (isset($submit)){ 
    // select all data from db for the current user 
    $st = $db->prepare('SELECT * FROM users WHERE email=?'); 
    $st->execute([$email]); 
    //$rows = count_rows_here 
    if($rows == 1){ 
     $row = $stmt->fetch(); 
     if(password_verify($password, $row['pass'])){ 
      $_SESSION['key'] = true; // notice the '=', and not '===' 
      $_SESSION['id'] = $row['id']; 
      $_SESSION['email'] = $row['email']; 
      $_SESSION['user'] = $row['username']; 
      $_SESSION['pass'] = $row['password']; 
      header('Location: profile.php'); 
     } else { 
      echo 'Error!'; 
     } 
    } 
} 
+0

以前從未聽說過termary操作員,將會檢查出來! –