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