2012-10-11 95 views
1

我正在仔细研究这一点。我是新来的PHPCookie不会持续存在多个页面PHP

我只是试图把一个querystring变量放在一个cookie中,并让它在网站上的所有页面上都可用。现在发生的事情是,只有在存在查询字符串时才设置cookie,并且一旦我进入另一个页面,cookie就会消失。

我所有的PHP页面有这样的代码顶部:

<?php 

$expire=time()+60*60*24*30; 

if (isset($_GET['v'])) { 
$thev = $_GET['v']; 

if (!isset($_COOKIE["ckv"])) { 
setcookie("ckv", $_GET['v'], $expire); 
} 
} else if (isset($_COOKIE["ckv"])) { 
$thev = $_COOKIE["ckv"]; 
} else { 
$thev = 'nothing'; 
} 
?> 
  1. 第1页的作品! (显示cookie)
  2. page1 no querystring WORKS! (显示cookie)
  3. page2 BROKEN。 (Cookie不见了!)

**这些按顺序点击。所以,第3页应该显示的cookie

谢谢

+1

页面2在不同的目录或子域中? –

回答

1

我上面的答案达成一致,考虑使用的$ _COOKIE代替会议。他们比饼干

http://us3.php.net/manual/en/features.sessions.php

+0

但是......他们做了不同的工作。如果您为无状态服务器场构建应用程序,那么PHP会话实际上是无用的(您需要使用Cookie和数据库进行备份)。如果您想要将数据从服务器共享到Javascript(在页面加载时),那么会话无法如此轻松完成(cookie可以)。您可能需要一个比cookie短的会话(但没有权限更改服务器上的会话长度)。如果服务器重新启动,会话也会丢失(因此您需要通过cookie +数据库进行备份)。不同的事情,会议有他们的位置,饼干有他们的。 – Robbie

0

更加灵活和更安全的显著可以有三个答案,我可以看到这一点。

最有可能的是页面1和页面2在不同的目录中。默认情况下,cookie被放置在当前目录中(如浏览器中指定的那样 - 忽略任何includes/apache重定向等),并将仅应用于该目录。您是否有

/dir1/page1 
/dir2/page2 

然后在第1页一个cookie不会,是默认情况下,在第2页

可以解决这个问题可通过指定路径(see documentation)。在这里您声明了cookie将应用于的目录 - 最常见的是将其设置为“/”(root),这意味着适用于应用程序中的任何页面。


现在的一些陷阱:

正如你已经有了一个cookie在“/ DIR1 /”,如果你修改代码以包括“/”的路径和运行,那么你会实际上有两个饼干 - 一个在'/'和一个在'/ dir1 /'。除非您先删除它,否则您的第1页仍会获得'/ dir1 /'Cookie。还要检查'/ dir2 /'中是否还有空白cookie(例如,在代码中没有“空白”,而不是空白 - 这意味着您有一个cookie,但空白值)。让子目录中的Cookie可能会引起很多挫折。

其他可能的原因是与缓存(确保你没有缓存值)和不同的域(你不能跨域共享cookie,如果你想跨子域共享,那么你需要指定根域 - 请参阅文档)。