2016-06-09 62 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

相關問題