我有一个PHP脚本处理传入的ajax请求。它从文本文件中查找一些凭据,如果它们符合要求,则会设置两个cookie,一个名为username,另一个名为客户端计算机上的cred。
当我从我的本地Web服务器执行此操作时,所有三个cookie都已设置,我从回声中收到所有php反馈。
当我从我的托管网络服务器执行此操作时,第一个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>";
}
?>
答案 0 :(得分:1)
您应该在setCookie
方法之后启用输出缓冲或移动回声。设置cookie是在响应标题期间发生的事情。所有标题都应在内容之前发送。回应事物正在设置内容,因此第一次回声后的每个标题版本(如设置cookie)都将失败。