2016-06-09 60 views
0

我有一个php脚本处理传入的ajax请求。它从文本文件中查找一些凭证,如果它们符合要求,它会设置两个Cookie,一个称为用户名,另一个称为客户机上的creds。为什么只有一个cookie在现场保存?

当我从我的本地Web服务器执行此操作时,所有三个cookie都会被设置,我会收到来自回声的所有php反馈。

当我从托管的Web服务器执行此操作时,第一个setcookie工作(“cookies”,“启用”),但接下来的两个不用!然而,我得到所有的回声确认PHP已经达到了我应该设置脚本的地步。请有任何想法吗?我彻底难倒了。

<?php 

    //george:bloog 
    //emeline:sparg 


    setCookie("primacy[cookies]","enabled", time()+3600*24*30,'/'); 


    //convert string to summed int 
    function pwdInt($pw) 
    { 
    $pwdIntVal = 0; 

    for($i=0; $i<strlen($pw);$i++) 
    { 
     $pwdIntVal = $pwdIntVal + (ord(strtolower($pw[$i])) - 96); 
    } 

    return $pwdIntVal; 
    } 

    //retrieve user account creation date by parsing savefile for accountCreate var 
    function getACD($aUSR) 
    { 
    $saveFileName = "saveFiles/" . $aUSR . ".txt"; 

    echo "Fetched save successfully.<br>"; 

    $lines = file($saveFileName); 
    foreach($lines as $line) 
    { 
     if(explode(":",$line)[0] == "accountCreate"); 
     $lineDate = explode(":",$line)[1]; 
     return $lineDate; 
    } 
    } 




    //accept incoming vars 
    if(isset($_POST['username']) && !empty($_POST['username'])) 
    { 
     $uN = strtolower($_POST['username']); 
     $pwd = strtolower($_POST['password']); 
     $found = "Invalid user"; 


     //test for presence in creds 
     $lines = file("creds/creds.txt"); 
     foreach($lines as $line) 
     { 
      $lineName = explode("_",$line)[0]; 
      if($uN == $lineName) 
      { 
      //matched username before delimiter "_" 
      $found = $lineName; 
      echo "Found user, " . explode("_",$line)[0] . " checking  password<br>"; 

      //check two: use int of pwd with account creation date from user save 
      $usrACD = getACD($uN); 
      echo $usrACD; 

      if( (pwdInt($pwd) * $usrACD) == (explode("_",$line)[1]) ) 
      { 
       echo "Tests passed: granting access cookies"; 
       setCookie("uN",$uN, time()+3600*24*30,'/'); 
       setCookie("cred",(pwdInt($pwd) * $usrACD),  time()+3600*24*30,'/'); 
      } 
      else 
      { 
       echo "Failed password check for allowed user<br>"; 
      } 
      } 
     } 
    } 
    else 
    { 
    echo $found . pwdInt($pwd) . "<br>"; 
    } 

?> 

回答

1

您应该启用输出缓冲或在setCookie方法后移动回波。设置cookie是响应标题期间发生的事情。所有标题应在内容之前发送。回应事物是设置内容,因此在第一次回声后每个标题版本(如设置cookie)都会失败。

+0

我读到最常见的原因是在标题响应后设置cookie。我不能正确理解ajax调用的时间。我会尝试没有回声,看看它是否工作。你能想一想为什么在我的本地机器上这不是问题吗? – KolKurtz

+1

您可能已在您的配置中启用输出缓冲。它会等待你的所有内容(这种情况下的回声)并缓冲它以避免在标题前发送它,这样你就可以在整个脚本中设置新的标题。当脚本完成执行时,它会发送所有收集的标题,然后发送缓冲区。 – yergo

+0

你说得对!我需要去阅读更多关于回声计时的工作原理。非常感谢。 – KolKurtz

相关问题