2014-02-07 151 views
0

我正在嘗試使用header("location")的公式。PHP數據會話重定向破壞

除了一件事情它工作得很好。當即時通訊嘗試設置持有該消息的會話它設置會話,但當我試圖寫出來,問題開始..

它像他走進去,如果然後刪除cookie,跳出當且改掉再次那裏..

這裏是我的代碼:

if (isset($_SESSION['sess_error'])) { 
    echo '<div class="alert alert-danger">'; 
    foreach ($_SESSION['sess_error'] as $val) { 
     echo $val.'<br>'; 
    } 
    unset($_SESSION['sess_error']); 
} 

if (empty($_POST['username'])) { $error[] = 'Du måste fylla i ett användarnamn...'; }  
if (empty($_POST['password'])) { $error[] = 'Du måste fylla i ett lösenord...'; } 
elseif ($sql->num_rows == 0) { $error[] = 'Något fel uppstog, du kunde inte bli inloggad...'; } 
if (count($error) > 0) { 
    $_SESSION['sess_error'] = $error; 
} 

任何人有任何想法,爲什麼發生這種情況,我可以做些什麼來阻止它呢?

整個腳本:

<?php 
SESSION_START(); 
    if (isset($_POST['login'])) { 
      $error = null; 
      $username = $_POST['username']; 
      $password = $_POST['password']; 
      $sql = $mysqli->query("SELECT * FROM users WHERE username='".$username."' AND password='".$password."' LIMIT 1"); 
      if (empty($_POST['username'])) { $error[] = 'Du måste fylla i ett användarnamn...'; } 
      if (empty($_POST['password'])) { $error[] = 'Du måste fylla i ett lösenord...'; } 
      elseif ($sql->num_rows == 0) { $error[] = 'Något fel uppstog, du kunde inte bli inloggad...'; } 
       if (count($error) > 0) { 
        $_SESSION['sess_error'] = $error; 
       } 
       else { 
        while ($r = $sql->fetch_array()) { 
         $_SESSION['sess_username'] = $r['username']; 
         $_SESSION['sess_userID'] = $r['userID']; 
         $_SESSION['sess_admin'] = $r['admin']; 
         $_SESSION['sess_logg'] = 1; 
        } 
       } 
       header("Location: ./"); 
      } 
?> 
+0

你什麼時候使用重定向?請添加重定向部分 –

+0

我認爲您在重定向之前顯示錯誤。當頁面重定向時,會話將被取消設置,並且消息不會顯示在重定向頁面中 – shanavascet

+0

您是否在構建表單驗證?如果是這樣,請保持在同一頁面上並將這些錯誤添加到表單域。 – Ruben

回答

0

我解決了整個問題,我不得不添加一個退出;在標題(「」)之後;它工作得很好!

-1

有可能是要設置窗體的錯誤頁面上的缺失start_session(),重定向後。

文件: 「login.php中」:

<?php 
    session_start(); 
    var_dump($_SESSION); 

    if(isset($_SESSION['session_logg']) && $_SESSION['session_logg'] === '1') { 
     echo 'Logged in :' . $_SESSION['session_username']; 
    } elseif (isset($_SESSION['sess_error'])) { 
     var_dump($_SESSION['sess_error']); 
     echo '<div class="alert alert-danger">'; 
     foreach ($_SESSION['sess_error'] as $val) { 
      echo $val.'<br>'; 
     } 
     echo '</div>'; 

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

    if (isset($_POST['login'])) { 
       $error = array(); 
       $username = isset($_POST['username']) ? $_POST['username'] : false; 
       $password = isset($_POST['password']) ? $_POST['password'] : false; 

       // no username or password given 
       if ($username === false or $password === false) 
       { 
        $_SESSION['sess_error'][] = 'Login Error.'; 
        header("Location: login.php"); 
        exit(); 
       } 

       // username, pw given, lets ask db for that guy 
       $sql = $mysqli->query("SELECT * FROM users WHERE username='".$username."' AND password='".$password."' LIMIT 1"); 

       // user not found in db, goodbye 
       if ($sql->num_rows == 0) { 
        $_SESSION['sess_error'][] = 'Något fel uppstog, du kunde inte bli inloggad...';  
        header("Location: login.php"); 
        exit(); 
       } 

       // user found 
       else { 
        $r = $sql->fetch_array()) { 
        $_SESSION['sess_username'] = $r['username']; 
        $_SESSION['sess_userID'] = $r['userID']; 
        $_SESSION['sess_admin'] = $r['admin']; 
        $_SESSION['sess_logg'] = 1; 
        header("Location: index.php"); 
        exit();        
       }      

    } 
    ?> 

側面說明:沒有相關型號您的問題:永遠不會顯示在登錄正確的錯誤。 說:「登錄失敗」,而不是「用戶名xy」未找到。

+0

它是session_start() –

+0

session_start位於頁面的頂部。我應該也可以發佈嗎? – Tommy

+0

是的!這是你問題的關鍵部分。 –