在页面重新加载两次之前,不会设置PHP cookie.什么';正在进行


PHP cookie will not set until the page reloads TWICE. What's going on?

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

共有2页。PageA.php有登录表单。填写表单并提交给PageB.php。PageB对数据库进行检查,检索结果,并设置值为username的cookie。然后,PageB使用头("location:PageA.php")重定向回PageA,在那里PageA应该假想地看到有一个设置的cookie,并更改为做一些无用和愚蠢的事情(即回显"欢迎回来,用户名")。但问题就在这里。一切都按计划进行,除了那该死的欢迎回来的声明。由于某种原因,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');

更奇怪的是,我在本地主机上没有问题,只有当它联机时(Bluehost)。如有任何见解,我们将不胜感激!提前谢谢。

编辑:我忘了提到PageA是索引(所以实际上命名为index.php)。我的头(位置)实际上重定向到了url(例如头('location:http://www.domainname.com’)。然而,我现在了解到,当我重定向到index.php而不是域名时,整个过程都是有效的。但是现在我在url中有一个丑陋的"/index.php"。

您的代码对我来说还可以。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,"/");

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

在重定向时删除www并保持原样http://domainname.com