PHP: 在cookie中设置会话信息不会在页面重新加载后保留?
PHP: Setting the session information in a cookie won't be kept after page reloads?
我有一个非常简单的 php 单页,需要用户输入特定的用户名并通过才能访问其内容。
它会生成一个 cookie,允许用户访问该页面一天。
如果用户已登录,则会显示内容列表。如果不是,则显示表格。
所有内容都在一个 index.php 页面中。
这个 "protected" 页面包含一个表单,用户可以在其中放置一些信息并保存。用户登录后,所有内容均按预期显示。但是当用户尝试提交该表单并重新加载页面时(新内容应该添加到该页面),它被踢出并且表单中包含的信息丢失,并且不会被保存。
这是 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);
}
[这里是如果我取消登录控制就可以正常工作的内容]
}
} 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 小时?
这是您构建 if 条件的方式。每次用户不提交 post 表单时,您都会覆盖 cookie。条件 isset($_SESSION['user'])
必须处于最高级别(首先),然后是 post 表单检查。
你也运行两次session_start()
,一次就够了
我将它用于这个确切的事情,并将其包含在任何页面的 header 中。
<?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();
}
你的测试顺序是这里的问题。您最初测试的是 POST 变量,而不是 SESSION 变量。试试这个:
测试注销以查看用户是否尝试注销。如果是,请删除会话。
测试会话变量以表明他们已经登录。
IF1和2为false,测试登录。如果是,初始化会话。
我有一个非常简单的 php 单页,需要用户输入特定的用户名并通过才能访问其内容。 它会生成一个 cookie,允许用户访问该页面一天。 如果用户已登录,则会显示内容列表。如果不是,则显示表格。
所有内容都在一个 index.php 页面中。
这个 "protected" 页面包含一个表单,用户可以在其中放置一些信息并保存。用户登录后,所有内容均按预期显示。但是当用户尝试提交该表单并重新加载页面时(新内容应该添加到该页面),它被踢出并且表单中包含的信息丢失,并且不会被保存。
这是 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);
}
[这里是如果我取消登录控制就可以正常工作的内容]
}
} 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 小时?
这是您构建 if 条件的方式。每次用户不提交 post 表单时,您都会覆盖 cookie。条件 isset($_SESSION['user'])
必须处于最高级别(首先),然后是 post 表单检查。
你也运行两次session_start()
,一次就够了
我将它用于这个确切的事情,并将其包含在任何页面的 header 中。
<?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();
}
你的测试顺序是这里的问题。您最初测试的是 POST 变量,而不是 SESSION 变量。试试这个:
测试注销以查看用户是否尝试注销。如果是,请删除会话。
测试会话变量以表明他们已经登录。
IF1和2为false,测试登录。如果是,初始化会话。