PHP:在cookie中设置会话信息;页面重新加载后是否无法保存?

PHP:在cookie中设置会话信息;页面重新加载后是否无法保存?,php,session,cookies,session-cookies,Php,Session,Cookies,Session Cookies,我有一个非常简单的php单页,需要用户插入一个特定的用户名和密码才能访问它的内容。 它生成一个cookie,允许用户访问该页面一天。 如果用户已登录,将显示内容列表。如果不是,则显示表单 它都在一个index.php页面中 这个单独的“受保护”页面包含一个表单,用户可以在其中放置一些信息并保存。用户登录后,所有内容均按预期显示。但当用户试图提交该表单并重新加载页面(新内容应添加到该页面)时,该表单会被踢出,表单中包含的信息会丢失,并且不会保存。 以下是index.php页面的特定部分: <

我有一个非常简单的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);
      }

[...]

我的问题是:如何让该用户登录并使用活动会话保持24小时?

这是构建if条件的方式。每次用户不提交post表单时,都会覆盖cookie。条件
isset($\u会话['user'])
必须处于最高级别(首先),然后是post表单检查


您还可以运行两次
session\u start()
,一次就足够了。

我使用它来实现这一点,并将其包含在任何页面的标题中

<?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());
        }
    }
}
?>

您的测试顺序是这里的问题。您最初测试的是POST变量,而不是会话变量。试试这个:

  • 测试注销以查看用户是否尝试注销。如果是,请删除会话

  • 测试会话变量以指示它们已登录

  • 如果1和2为假,则测试登录。如果是,初始化会话

  • <?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();
    }