在提交表单之前不会读取php cookie

时间:2012-10-26 09:54:20

标签: php cookies setcookie

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

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

  2. 即使代码输出了Cookie,在下次访问该页面之前,它也不会出现在$_COOKIE数组中。

  3. 第一次通过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个月,则应将该页面视为第一次访问。

0 个答案:

没有答案