2016-05-15 108 views
1

我有一個非常簡單的php單頁,這需要用戶插入一個特定的用戶名,並通過以訪問其內容。 它生成一個cookie,允許用戶訪問該頁面一天。 如果用戶登錄,則顯示內容列表。如果不是,則顯示該表單。PHP:在頁面重新加載後,Cookie中設置會話信息將不會保留?

它都在一個index.php頁面中。

這個單一的「受保護」頁面包含一個表單,用戶可以放置一些信息並保存。用戶登錄後,所有內容都按預期顯示。但是,當用戶嘗試提交該表單並重新加載頁面(應將新內容添加到該頁面)時,它會被踢出,表單中包含的信息會丟失,並且不會被保存。

這是index.php頁面的特定部分:

<?php session_start(); ?> 
<!DOCTYPE html> 
[...] 

<?php 
if(isset($_POST['loguearse'])) { 
    $_SESSION['user']=strip_tags($_POST['user']); 
    $_SESSION['pass']=strip_tags($_POST['pass']); 
    if($_SESSION['user'] == 'myuser' && $_SESSION['pass'] == 'mypass') { 
     if (isset($_SESSION['user'])) { 
     session_start(); 
       setcookie ("usuario",$_POST['user'], time()+24*60*60); 
       setcookie ("clave",$_POST['pass'], time()+24*60*60); 
     } 

[這裏有雲的作品OK內容如果我剝Login控件]

} 
    } else { 
        setcookie("usuario",""); 
        setcookie("clave",""); 

     echo ' 
      <form method="post"> 
       <div class="form-group"> 
       <input type="text" class="form-control" name="user" id="user" placeholder="Usuario"> 
       </div> 
       <div class="form-group"> 
       <input type="password" class="form-control" name="pass" id="pass" placeholder="clave"> 
       </div> 
       </div> 
       <div class="modal-footer"> 
       <input type="submit" name="loguearse" class="btn btn-primary"> 
       </div> 
      </div> 
      </form> 
     '; 
     echo 'No puedes entrar sin poner la clave correcta!'; 
    } 
?> 

我的問題是:我如何讓該用戶登錄並在24小時內進行活動會話?

回答

1

您的測試順序這裏的問題。您最初測試的是POST變量,而不是SESSION變量。試試這個:

  1. 測試註銷以查看用戶是否嘗試註銷。如果是這樣,請刪除會話。

  2. 試驗會話變量來表示他們已經登錄。

  3. IF 1和2是假的,測試登錄。如果是這樣,初始化會話。

1

這是你構建你的if條件的方式。每次用戶不提交帖子表格時,都會覆蓋cookie。條件isset($_SESSION['user'])必須處於最高級別(首先),然後進行表單檢查。

你也跑了兩次session_start(),一次就夠了。

1

我使用這個確切的東西,只是將其包含在任何頁面的標題中。

<?php 
@session_start(); 
// DB DEFINITIONS 
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/db.php'); 
$db = db_connect(); 

if(isset($_GET['logout'])){ 
    session_unset(); 
    session_destroy(); 
    if (isset($_COOKIE['cookuhash']) && isset($_COOKIE['cookfhash'])){ 
     setcookie("cookuhash", "", time()-2592000,"/"); 
     setcookie("cookfhash", "", time()-2592000,"/"); 
     $uhash=$db->real_escape_string($_COOKIE['cookuhash']); 
     $fhash=$db->real_escape_string($_COOKIE['cookfhash']); 
     $db->query("DELETE FROM tblsessions WHERE USER_HASH='$uhash' AND FORM_TOKEN='$fhash'"); 
    } 
    header("Location: /index.php"); 
    exit(); 
} 

if(!isset($_SESSION['loggedIn'])){ 
    $_SESSION['loggedIn']=false; 
    $_SESSION['username'] = 'Anonymous'; 
    $_SESSION['userid'] = 0; 
    $_SESSION['userlevel'] = 0; 
    $_SESSION['formToken'] = sha1(microtime()); 
} 

if (!$_SESSION['loggedIn'] && isset($_COOKIE['cookuhash']) && isset($_COOKIE['cookfhash'])){ 
    $uhash=$db->real_escape_string($_COOKIE['cookuhash']); 
    $fhash=$db->real_escape_string($_COOKIE['cookfhash']); 
    $result = $db->prepare("SELECT u.id,uname, lvl, user_lvl_expires FROM tblusers u LEFT JOIN tblsessions s ON s.USER_ID=u.ID WHERE USER_HASH='$uhash' AND FORM_TOKEN='$fhash'"); 
    $result->execute(); 
    $result->bind_result($id,$uname,$ads,$lvl,$expires); 
    $result->store_result(); 
    if($result->num_rows > 0){ 
     while ($result->fetch()) { 
      $_SESSION['loggedIn']=true; 
      $_SESSION['username'] = $uname; 
      $_SESSION['userid'] = $id; 
      $_SESSION['userlevel'] = $lvl; 
      $_SESSION['expires'] = $expires; 
      $_SESSION['formToken'] = sha1(microtime()); 
     } 
    } 
} 
?> 

然後在任意頁面,只需檢查:

@session_start(); 
if((!isset($_SESSION['loggedIn']) || $_SESSION['loggedIn']==0) && !isset($_COOKIE['cookuhash'])){ 
    header("Location: /login.php"); 
    exit(); 
}