1

我有一个奇怪的 php setcookie 问题。让我显示代码

setcookie('aaa', 'aaa', time()+100);  // aaa cookie can be set
if($_POST){
    setcookie('bbb', 'bbb', time()+100);   // bbb cookie can't be set
    echo 'bbb';
}

可以设置aaa cookie。但是不能设置 bbb cookie。
我 100% 确定 if 条件为真且 bbb 为回显。

这是真正的代码。
但最奇怪的是有时可以设置'bbb' cookie。
所以我认为有一些配置问题。

我正在运行 Apache(2.2.20) 和 PHP(5.3.6)

编辑:<br> 我在同一域和同一目录的 iframe 中运行此页面。

4

6 回答 6

2

通常,当您在设置 cookie 时遇到问题,是因为headers在您之前已经发送了 cookie setcookie。当你处于这种if状态时,做

if(headers_sent()) 
    throw new Exception('Headers were already sent!!!');

如果您遇到异常,那么您的标头会在您设置 cookie 之前发送,因此您的 cookie 不会发送到客户端的浏览器。

于 2012-11-05T03:30:42.100 回答
1

你在测试什么?有一个帖子数组还是有值?在你的条件中明确反映你想要什么。根据需要使用 empty()、is_null()、===、== 或 isset()。我猜你真的想确保发布值,所以使用

if(!empty($_POST)){
  // values were posted, do cookie stuff here....
}

如果您不关心值是否是 posred,但实际上只是想知道该操作是 post 使用:

 if ($_SERVER['REQUEST_METHOD'] === 'POST') {
于 2012-11-05T03:27:44.447 回答
0

您需要指定保存 cookie 的参数路径:

setcookie('name', 'value', time()+100, '/');

设置cookie()

于 2012-11-05T03:33:58.187 回答
0

我很确定条件返回错误。

调试的第一步是在条件内回显。

if($_POST){ echo "测试"; }

另外,我会使用 isset 而不是if($var)因为在您的情况下,如果$_POST未设置,您将生成一个您必须禁止的通知。

有更好、更精确的方法来正确处理这种情况。例如:isset($var),!isset($var), is_null($var), empty($var)

添加 :

既然你说 echo 有效,我建议使用 setcookie 和所有基本句柄。

if($_POST){ setcookie('bbb', 'bbb', time()+100, '/','yoursite.com'); }

我不确定这是否必须做任何事情,但试试看。显然你需要在到期前检查(不到 2 分钟)

于 2012-11-05T03:41:02.197 回答
0

您无法设置 cookie 的原因是如果:

if($_POST){
    setcookie('bbb', 'bbb', time()+100);   // bbb cookie can't be set
}

正在回归false

你可能的意思是:

if(isset($_POST['bbb']) && $_POST['bbb'] !="") {
    setcookie('bbb', 'bbb', time()+100);
}
于 2012-11-05T03:25:39.240 回答
0
if($_POST) { ... }

与其他请求方法不同,它不是检测 POST 请求的可靠方法。

相反,您可能想要使用类似的东西:

if($_SERVER['REQUEST_METHOD'] === 'POST') { ... }
于 2012-11-05T03:26:12.223 回答