我遇到的问题是,在我提交页面之前,即使在回访页面时,也没有读取正在设置的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
中有一个简单的php if
语句,它检查$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个月,则应将该页面视为第一次访问。