2016-05-15 116 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(); 
}