我遇到了一个问题,即在我提交页面之前,即使在回访页面时,也不会读取正在设置的 cookie。
基本上,我在页面上有一个小表格。提交页面并处理 2 个 cookie 后。第一个与浏览器会话过期并告诉页面显示感谢消息,第二个在一个月后过期并告诉页面显示另一条消息。如果未找到适当的 cookie,则页面默认显示表单。
在上面DOCTYPE
我有以下代码,它查找 cookie 并设置一个变量来显示正确的页面
$display = $DISPLAY_FORM;
if ((!empty($_COOKIE[$COOKIE_RETURN])) && ($_COOKIE[$COOKIE_RETURN] == $COOKIE_RETURN))
{
// If a return visitor, show DISPLAY_HIDDEN
$display = $DISPLAY_HIDDEN;
}
if ((!empty($_COOKIE[$COOKIE_REG])) && ($_COOKIE[$COOKIE_REG] == $COOKIE_REG))
{
// If a new registration, show DISPLAY_THANKS
$display = $DISPLAY_THANKS;
}
之后是检查和处理表单的逻辑。如果一切正确,它将设置 2 个 cookie 并将$display
变量设置为$DISPLAY_THANKS
setcookie($COOKIE_REG, $COOKIE_REG, 0, "/");
setcookie($COOKIE_RETURN, $COOKIE_RETURN, strtotime("+1 month"), "/");
$display = $DISPLAY_THANKS;
该代码正在子目录中运行,因此根据我的理解,使用该"/"
路径应该使 cookie 对整个站点可见。$COOKIE_REG
应该设置一个具有相同名称和值的cookie,它应该在浏览器关闭时过期。$COOKIE_RETURN
应设置一个具有相同名称和值的 cookie,并应在 1 个月后过期。
这都是在DOCTYPE
元素之前,并且在设置 cookie 时不会引发任何错误。在页面BODY
中有一个简单的 phpif
语句,它检查$display
变量以查看要显示的状态。
当我第一次使用该页面时,我看到了表单。我填写表格,提交,页面返回感谢信息。一切都很好。但是,如果我单击站点上的另一个页面,然后再次导航到 cookie 页面,我会看到表单,而不是感谢消息。如果我关闭浏览器(这应该结束第一个 cookie)并返回页面,我会再次获得表单。
由此看来,cookie 没有被设置。但是,在setcookie
代码和 cookie 读取if
语句之前,我添加了echo print_r($_COOKIE, true);
. 在第一次访问我的页面时,预期的 cookie 不可见,但是当我提交表单时,它们就在那里。Cookie 未在此提交中设置为:
代码正在回显
print_r
,因此标头已发送,因此无法写入新的 cookie(我收到错误消息以确认这一点)。即使代码正在输出一个 cookie,它也不会出现在
$_COOKIE
数组中,直到下次访问该页面。
第一次通过print_r
退货
Array
(
[17a7190f9ad90db58025cb2dea23788f] => 73fcd0caf5e997e47097a4eade799c59
)
第二次,提交表单后返回
Array
(
[returnVisitor] => returnVisitor
)
任何帮助都会很棒。
--- 编辑 - 下面添加的主要代码主体 ---
<?php
// These variables define what is displayed on the page.
$DISPLAY_HIDDEN = 0;
$DISPLAY_FORM = 1;
$DISPLAY_THANKS = 2;
// This variable is where the display type is set, it defaults to show the form
$display = $DISPLAY_FORM;
// Cookie variables
$COOKIE_REG = "formComplete";
$COOKIE_RETURN = "returnVisitor";
// echo print_r($_COOKIE, true);
// Check for a cookie to see if the form has been completed already.
// If there is a cookie, check to see if it's a new registration cookie or a return visitor
if ((!empty($_COOKIE[$COOKIE_REG])) && ($_COOKIE[$COOKIE_REG] == $COOKIE_REG))
{
// If a new registration, show DISPLAY_THANKS
$display = $DISPLAY_THANKS;
}
else if ((!empty($_COOKIE[$COOKIE_RETURN])) && ($_COOKIE[$COOKIE_RETURN] == $COOKIE_RETURN))
{
// If a return visitor, show DISPLAY_HIDDEN
$display = $DISPLAY_HIDDEN;
}
// If no cookie exists, check to see if the form has been submitted
else if ( !empty($_REQUEST['formSubmit']) )
{
// -- REMOVED FOR STACK OVERFLOW - Processes form data --
// Create and set 2 cookies
// Cookie 1: Expires when the browser closes and is for new registrants
setcookie($COOKIE_REG, $COOKIE_REG, 0, "/");
// Cookie 2: Expires in a month and is for returning visitors
setcookie($COOKIE_RETURN, $COOKIE_RETURN, strtotime("+1 month"), "/");
// Set the page to display the thanks screen
$display = $DISPLAY_THANKS;
}
?>
<!DOCTYPE html>
<html lang="en-gb">
<head>
-- REMOVED FOR STACK OVERFLOW --
</head>
<body>
<?php if ($display == $DISPLAY_FORM) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the form is drawn. ---
<?php } else if ($display == $DISPLAY_THANKS) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the thank you message is drawn. ---
<?php } else if ($display == $DISPLAY_HIDDEN) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the returning visitor message is drawn. ---
<?php } // endif ?>
</body>
</html>
预期行为
首次访问页面
没有设置 cookie,也没有提交表单,所以使用了显示表单的默认选项。按预期工作
通过表单提交第二次访问页面
未设置 cookie,但已提交表单。处理表单数据,设置 cookie,并$display
告诉内部变量显示感谢消息。似乎按预期工作
页面的后续访问直到浏览器关闭
找到了$COOKIE_REG
cookie,它将$display
变量设置为显示感谢页面。
浏览器关闭后对页面的后续访问
如果在提交表单后的 1 个月内,$COOKIE_RETURN
应找到 cookie 并$DISPLAY_HIDDEN
绘制页面。如果 1 个月过去了,该页面应该被视为第一次访问。