在页面重新加载TWICE之前,PHP cookie不会设置。这是怎么回事?

时间:2012-01-13 06:03:29

标签: php cookies setcookie

好的,这是一个奇怪的。我正试图处理我的第一个登录系统,所以请耐心等待。

共有2页。 PageA.php有登录表单。填写表格并提交给PageB.php。 PageB对数据库运行检查,检索结果,并使用username的值设置cookie。然后PageB使用header('location:PageA.php')重定向回PageA,其中PageA应该看到有一个设置的cookie,并改为做一些无用和愚蠢的事情(即echo“欢迎回来,用户名”)。但问题出在这里。一切都按计划进行,除了那个该死的欢迎回复声明。由于某种原因,cookie没有设置。或者我认为。然后我回到url地址,在我的浏览器中重新输入url,按回车键,然后瞧。现在已经识别出cookie,一切都很美妙。它甚至可以工作,如果你要注销并重新登录,你就不需要重新加载。

此外,如果您只是输入两次信息(即第一次失败,然后您在PageA上立即再次执行,然后它可以工作),登录也可以工作。这是相关的代码:

PageA.php:

    <?php if(empty($_COOKIE['user'])){?>
        <form action="PageB.php" method="get">

        <input onfocus="this.value='';" maxlength="35" type="text" class="username" value="Username" name="username" />

        <input onfocus="this.value='';" maxlength="12" type="password" class="username" value="Password" name="password"/>


        <input type="image" id="login" src="Images/home/login_button.png" />
        </form>
        <?php }
        else {

            echo "<div id='welcome'>Welcome, ".$_COOKIE['user']."!</div>

        ";
        }?>

PageB.php:

$query="SELECT * FROM users where username='".$user."' and password='".$pw."' LIMIT 1";
$result=mysql_query($query,$con);

$num_rows = mysql_num_rows($result);

if($num_rows>0){

    while($row = mysql_fetch_array($result)){

        $username=$row['username'];

    }

    if(isset($_COOKIE['user'])){

        setcookie('user',$username,time()-2000);

    }

    setcookie('user',$username,time()+3600*168,"/");

}
mysql_close();

header('location:PageA.php');

更奇怪的是,我在localhost上没有任何问题,只有当它被放到网上时(Bluehost)。任何见解将不胜感激!提前谢谢。

编辑:我忘了提到 PageA 是索引(实际上名为index.php)。我的标题(位置)实际上重定向到url(例如标题('location:http://www.domainname.com')。但是我现在知道当我重定向到index.php而不是域名时整个过程都有效但是现在我在网址上有那个丑陋的“/index.php”。

2 个答案:

答案 0 :(得分:3)

您的代码看起来不错。 PageA 的输出可能会被浏览器缓存。尝试向 PageA 添加一些额外的标题(请记住在输出任何其他内容之前添加它们):

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

他们应该阻止浏览器缓存。


此外,您在一个请求(在某些情况下)中更改了相同的Cookie两次:

if(isset($_COOKIE['user'])){

    setcookie('user',$username,time()-2000);

}

setcookie('user',$username,time()+3600*168,"/");

这应该没有问题但是没有意义 - 第一个请求将被第二个请求覆盖。

答案 1 :(得分:3)

在重定向上移除www并将其保留为http://domainname.com