提交表单后才能读取php Cookie

提交表单后才能读取php Cookie,php,cookies,setcookie,Php,Cookies,Setcookie,我遇到一个问题,在我提交页面之前,设置的cookie不会被读取,即使是在回访页面时也是如此 基本上,我在页面上有一个小表单。提交页面并设置进程2 cookie后。第一个在浏览器会话中过期,并告诉页面显示感谢消息;第二个在一个月后过期,并告诉页面显示另一条消息。如果未找到相应的cookie,则页面默认显示表单 在DOCTYPE上方,我有以下代码查找cookies并设置一个变量以显示正确的页面 $display = $DISPLAY_FORM; if ((!empty($_COOKIE[$COOK

我遇到一个问题,在我提交页面之前,设置的cookie不会被读取,即使是在回访页面时也是如此

基本上,我在页面上有一个小表单。提交页面并设置进程2 cookie后。第一个在浏览器会话中过期,并告诉页面显示感谢消息;第二个在一个月后过期,并告诉页面显示另一条消息。如果未找到相应的cookie,则页面默认显示表单

DOCTYPE
上方,我有以下代码查找cookies并设置一个变量以显示正确的页面

$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\u谢谢

setcookie($COOKIE_REG, $COOKIE_REG, 0, "/");
setcookie($COOKIE_RETURN, $COOKIE_RETURN, strtotime("+1 month"), "/");

$display = $DISPLAY_THANKS;
代码正在一个子目录中运行,因此据我所知,使用
“/”
路径应该使cookie对整个站点可见<代码>$COOKIE_REG应设置具有相同名称和值的COOKIE,该COOKIE应在浏览器关闭时过期
$COOKIE\u RETURN
应设置具有相同名称和值的COOKIE,并应在1个月后过期

这都在
DOCTYPE
元素之前,在设置cookie时不会抛出任何错误。在
BODY
页面中,有一个简单的php
if
语句,它检查
$display
变量以查看要显示的状态

当我第一次使用页面时,我看到了表单。我填写表格,提交,页面返回到感谢信息。一切都很好。但是,如果我单击站点上的另一个页面,然后再次导航到cookie页面,我将看到表单,而不是感谢消息。如果我关闭浏览器(应该结束第一个cookie)并返回页面,我将再次获得表单

从这个角度看,cookies似乎没有被设置。然而,在
setcookie
code和cookie读取
if
语句之前,我添加了
echo print\r($\u cookie,true)。在第一次访问我的页面时,预期的cookie不可见,但是当我提交表单时,它们就在那里。此提交上未将Cookie设置为:

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

  • 即使代码正在输出cookie,它也不会出现在
    $\u cookie
    数组中,直到下次访问页面

  • 第一次通过
    print\r
    返回

    Array
    (
        [17a7190f9ad90db58025cb2dea23788f] => 73fcd0caf5e997e47097a4eade799c59
    )
    
    第二次,提交表单后返回

    Array
    (
        [returnVisitor] => returnVisitor
    )
    
    任何帮助都会很好

    ---编辑-下面添加了主代码体---


    使用$\u会话而不是$\u COOKIE来存储您要存储的信息,这些信息将随浏览器会话过期。浏览您的问题看起来是因为cookies设置在页面的末尾,所以它们只在下次刷新时出现$_会话将立即设置。我希望cookie在第一次和第二次查看页面时不会工作,这就是我使用变量处理显示的原因。问题是,在第三个页面视图中,未拾取已设置的cookie。由于两个cookie都没有按预期工作,我宁愿尝试让两个cookie都工作,因为即使我将会话用于一个cookie,另一个cookie也会存在问题。有没有可能我们可以查看更多的代码?对于很多开发人员(比如我自己)来说,阅读代码比阅读代码周围的注释和描述更容易。另外,您正在获得的输出与您期望的输出是一致的。我将修改主要帖子,以包含代码的主体。为了节省空间,我将取出不相关的零件。
    
    <?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>