我很久以前就已经发布了一个问题,但我仍然找不到答案。基本上,当用户登录帐户并且一段时间处于非活动状态时,当他们返回时,他们会点击某些内容,然后系统会将其注销,他们必须重新登录。它有90%的时间可以工作,但有时会出现如下错误:此页面以永远不会完成的方式重定向。
但是当用户清除cookie时,它工作正常,有时关闭选项卡并打开一个新选项也有效。
以下是代码:
<?php
$SUBDOMAIN = mysql_real_escape_string($_GET['p_name']);
$pname = mysql_real_escape_string($_GET['p_name']);
echo "$p_name";
include("db.php");
?>
<?php
session_start();
// Process the POST variables
$username = $_SESSION["user_name"];
//$password = $_POST["password"];
// Set up the session variables
$_SESSION["user_name"] = $username;
$ugData = $_REQUEST['p_name'];
if($_POST)
{
$_SESSION['user_name']=$_POST["user_name"];
$_SESSION['password']=$_POST["password"];
}
$secret = $info['password'];
//Checks if there is a login cookie
if(isset($_COOKIE['ID_my_site']))
//if there is, it logs you in and directes you to the members page
{
$username = $_COOKIE['ID_my_site'];
$pass = $_COOKIE['Key_my_site'];
$check = mysql_query("SELECT user_name, password FROM accounts WHERE user_name = '$username' and p_name='$ugData'")or die(mysql_error());
while($info = mysql_fetch_array( $check ))
{
if (@ $info['password'] != $pass)
{
}
else
{
header("Location: home.php");
}
}
}
//if the login form is submitted
if (isset($_POST['submit']))
{
// if form has been submitted
// makes sure they filled it in
if(!$_POST['user_name'] | !$_POST['password'])
{
die('You did not fill in a required field.');
}
//checks it against the database
if (!get_magic_quotes_gpc())
{
$_POST['user_name'] = addslashes($_POST['user_name']);
}
$check = mysql_query("SELECT user_name,password FROM accounts WHERE user_name = '".$_POST['user_name']."' and p_name='".$ugData."'")or die(mysql_error());
//Gives error if user dosen't exist
$check2 = mysql_num_rows($check);
if ($check2 == 0)
{
die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');
}
while($info = mysql_fetch_array( $check ))
{
$_POST['password'] = md5($_POST['password']);
$_POST['password'] = $_POST['password'];
//gives error if the password is wrong
if (@ $_POST['password'] != $info['password'])
{
die('Incorrect password, please try again');
}
else
{
// if login is ok then we add a cookie
$_POST['user_name'] = stripslashes($_POST['user_name']);
$hour = time() + 3600;
setcookie(ID_my_site, $_POST['user_name'], $hour);
setcookie(Key_my_site, $_POST['password'], $hour);
//then redirect them to the members area
header("Location: home.php");
}
}
}
else
{
// if they are not logged in
?>
</table>
</form>
<?php
}
?>
答案 0 :(得分:1)
嘿,你的代码格式化真的很糟糕没有乐趣,你可能想解决这个问题。 :)
我只是快速浏览一下,错误只发生了90%或者有时难以捕捉。
我发现你最后使用header("Location: home.php");
而没有任何exit;
,除非你打算这样做,否则这通常是一个坏主意。
函数调用header("Location: home.php");
不会停止处理脚本。用户可能会获得标题并重定向并停止处理代码(取决于某些php设置),但可能会在用户重定向之前设置一些cookie。所以尝试添加退出;重定向标题调用后。
格式化代码
答案 1 :(得分:1)
我猜赌这会因为您的会话Cookie的过期时间不同以及您为ID_my_site
和Key_my_site
Cookie设置的过期时间而产生。如果未被覆盖,则默认会话超时为30分钟(在设置中表示为秒 - 因此为1,800)。您的Cookie将在一小时后过期。因此,您可能会发现自己处于会话已过期的情况,但其他Cookie仍然存在。根据您检查事物的顺序/方式然后重定向,如果用户闲置超过30分钟但不到1小时,您将遇到这种情况。
由于您在此代码示例中执行的唯一重定向是home.php
,因此在该文件中会进行某种检查,即在永无止境的重定向螺旋上发送它们。
顺便说一句,该代码示例确实非常混乱。例如,您经常分配和重新分配$username
变量(以及看似不同类型的事物 - 虽然我不知道如果没有看到实际输入),难怪您有神秘问题。例如,这几行是多余的:
// Process the POST variables
$username = $_SESSION["user_name"];
//$password = $_POST["password"];
// Set up the session variables
$_SESSION["user_name"] = $username;
您正在从会话中分配$username
并立即将其分配回来。
从文件的开头:
$SUBDOMAIN = mysql_real_escape_string($_GET['p_name']);
$pname = mysql_real_escape_string($_GET['p_name']);
这两个变量被赋予相同的$_GET
值,但似乎并未使用$SUBDOMAIN
。
从文件末尾开始,您要分配两次相同的值:
$_POST['password'] = md5($_POST['password']);
$_POST['password'] = $_POST['password'];
我真的很鼓励你退出代码,看看你的输入,找出你需要完成什么,并完全重构或重写这段代码。有这样的东西漂浮在你周围,难怪你的系统中有神秘的错误。
答案 2 :(得分:1)
此外,HTTP Location标头要求URL是绝对的。你应该使用这样的东西:
$ currentServerHost = $ _SERVER ['HTTP_HOST']; $ currentBaseURI = $ currentServerHost。 rtrim(dirname($ _ SERVER ['PHP_SELF']),'/ \');
header('Location:'。'http://'。$ finalURI。'/ home.php'); 出口;