开发者

Recurring redirect error

I have posted a question for this a long time ago, but i still can't find a answer. Basically, when a user has logged into the account and has been inactive for a while and when they return they would click something and then the system would log them out and they would have to re-login. It works 90% of the time, but sometimes it gives an error like: This page is redirecting in a way it will never complete.

But when a user clears the cookies it works fine and sometimes closing the tab and opening up a new one works too.

Here's the code:

<?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);

 开发者_C百科  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 
} 

?> 


Hey, your code formatting is really bad no fun to read you might want to fix that. :)

I just had a quick look at it, erros occurring only 90% or sometimes hard to catch.

I saw you are using header("Location: home.php"); without any exit; at the end, which is generally a bad idea unless you intent to do so.

The function call header("Location: home.php"); will not stop the script from processing. The user might get the header and redirects and stops code from processing (depending on some php settings) but maybe some cookies get set before the user gets redirected. So try adding a exit; after your redirect header calls.

format you code


I would wager a guess that this has to due with the differing expire times of your session cookie, and the expire times you set for your ID_my_site and Key_my_site cookies. If not overridden, the default session timeout is 30 minutes (expressed as seconds in the settings - so 1,800). Your cookies are set to expire after an hour. So you could find yourself in a situation where the session has expired, but the other cookies are still present. Depending on the order / way you are checking things and then redirecting, you will encounter this situation if the user was idle for more than 30 minutes but less than 1 hour.

Since the only redirect you are performing in this code sample is the one to home.php, there is some sort of check occurring in that file, that is sending them on the never ending redirect spiral.

As an aside, that code sample really is very messy. You are assigning and reassigning the $username variable so often for example (and to seemingly different types of things - though I wouldn't know without seeing actual input), that it is no wonder you are having mystery issues. These few lines for example are redundant:

// Process the POST variables
$username = $_SESSION["user_name"];
//$password = $_POST["password"];

// Set up the session variables
$_SESSION["user_name"] = $username;

You're assigning $username from the session and immediately assigning it back.

From the beginning of the file:

$SUBDOMAIN = mysql_real_escape_string($_GET['p_name']);
$pname = mysql_real_escape_string($_GET['p_name']);

These two variables are assigned the same $_GET value, but it doesn't appear that $SUBDOMAIN is ever used.

And from the end of the file you are assigning the same value twice:

$_POST['password'] = md5($_POST['password']);
$_POST['password'] = $_POST['password'];

I really would encourage you to step back from your code, look at your inputs and figure out what you need to accomplish and refactor or rewrite this code entirely. With stuff like this floating around it is no wonder you have mystery bugs in your system.


Additionally, a HTTP Location header requires the URL to be absolute. You should use something like this:

$currentServerHost = $_SERVER['HTTP_HOST']; $currentBaseURI = $currentServerHost . rtrim(dirname($_SERVER['PHP_SELF']), '/\');

header( 'Location: ' . 'http://' . $finalURI . '/home.php' ); exit;

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜