1

我遇到了一个问题,即在我提交页面之前,即使在回访页面时,也不会读取正在设置的 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 未在此提交中设置为:

  1. 代码正在回显print_r,因此标头已发送,因此无法写入新的 cookie(我收到错误消息以确认这一点)。

  2. 即使代码正在输出一个 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_REGcookie,它将$display变量设置为显示感谢页面。

浏览器关闭后对页面的后续访问

如果在提交表单后的 1 个月内,$COOKIE_RETURN应找到 cookie 并$DISPLAY_HIDDEN绘制页面。如果 1 个月过去了,该页面应该被视为第一次访问。

4

0 回答 0