2014-03-24 104 views
0

我在教自己的PHP所以这可能是愚蠢的东西我还不知道,但为什么我的重定向不工作...PHP重定向无法成功登录

我想要做到这一点:

header("Location: members.php?view=$user"); exit;

它没有做任何事情,但是当我把在模具声明的链接在成功登录

die("You are now logged in. Please <a href='members.php?view=$user'>click here</a> to continue.");

我可以点击该链接,它工作正常。

全码

<?php //login.php 
    include_once 'header.php'; 
    echo "<div class='main'><h3>Please enter your details to log in</h3>"; 
    $error = $user = $pass = ""; 

    if (isset($_POST['user'])) { 
    $user = sanitizeString($_POST['user']); 
    $pass = sanitizeString($_POST['pass']); 

    if ($user == "" || $pass == "") { 
     $error = "Not all fields were entered<br />"; 
    } 
    else { 
     $query = "SELECT user,pass FROM members WHERE user='$user' AND pass='$pass'"; 

     if (mysql_num_rows(queryMysql($query)) == 0) { 
     $error = "<span class='error'>Username/Password invalid</span><br /><br />"; 
     } 
     else { 
     $_SESSION['user'] = $user; 
     $_SESSION['pass'] = $pass; 
     header("Location: members.php?view=$user"); exit; 
     } 
    } 
    } 

echo <<<_END 
<form method='post' action='login.php'>$error 
<span class='fieldname'>Username</span><input type='text' maxlength='16' name='user' value='$user' /><br /> 
<span class='fieldname'>Password</span><input type='password' maxlength='16' name='pass' value='$pass' /> 
_END; 
?> 

<br /> 
<span class='fieldname'>&nbsp;</span> 
<input type='submit' value='Login' /> 
</form><br /></div></body></html> 



<?php //header.php 
session_start(); 
echo "<!DOCTYPE html>\n<html><head><script src='js/osc.js'></script>"; 
include 'functions.php'; 

$userstr = ' (Guest)'; 

if (isset($_SESSION['user'])) { 
    $user  = $_SESSION['user']; 
    $loggedin = TRUE; 
    $userstr = " ($user)"; 
} 
else { 
    $loggedin = FALSE; 
} 

echo "<title>$appname$userstr</title><link href='css/main.css' rel='stylesheet' type='text/css' />" . 
    "</head><body><div class='$appname'>$appname$userstr</div>"; 

if ($loggedin) { 
    echo "<br /><ul class='menu'>" . 
    "<li><a href='members.php?view=$user'>Home</a></li>" . 
    "<li><a href='members.php'>Members</a></li>" . 
    "<li><a href='friends.php'>Friends</a></li>" . 
    "<li><a href='messages.php'>Messages</a></li>" . 
    "<li><a href='profile'>Edit Profile</a></li>" . 
    "<li><a href='logout.php'>Log Out</a></li></ul><br />"; 
} 
else { 
    echo ("<br /><ul class='menu'>" . 
    "<li><a href='index.php'>Home</a></li>" . 
    "<li><a href='signup.php'>Sign Up</a></li>" . 
    "<li><a href='login.php'>Log In</a></li></ul><br />" . 
    "<span class='info'>&#8654; You must be logged in to view this page.</span><br /><br />" 
    ); 
} 

?> 

我试着在上面除去第一echo,还有$error消息。就像我说的,我试图改进我从this O'Reilly book中挑选的代码,所以我非常感谢任何帮助,指导和批评等。

+4

在您调用'header()'之前显示代码 –

+0

可能的[如何修复]已经发送的头文件“PHP中的错误”的副本(http://stackoverflow.com/questions/8028957/how-to-fix -headers-already-sent-error-in-php) –

+6

我打赌一百万美元在标题调用之前有输出 – 2014-03-24 19:31:38

回答

3

在设置Location标头之前,PHP脚本的任何输出(回显)将导致重定向失败。在一个理想的世界中,重定向用户的脚本不应该有真正的身体,尽管许多人仍然这样做。

在调用Header之前删除任何回显行。

0

您必须在标题函数之前删除生成任何html的代码,或者尝试将ob_start()正确地放在页面的开头(最好是第一行)。

-1

正如Aeaex所说的那样,echo会使您的标题重定向失败。作为替代使用的报头重定向,可以回声此:

'<meta http-equiv="refresh" content="2;url=http://myurl.com">'; 

其中在内容中的数字2是重定向之前的秒的数量,如果需要立即进行其设置为0。

虽然这可能是不好的做法,并打破W3验证。

1

您在重定向之前输出。输出发送到浏览器后,您无法重定向。

echo "<div class='main'><h3>Please enter your details to log in</h3>"; 

将此代码块移到您的重定向代码之后。

+0

我把它移到'echo <<< _ END'之前的行,但重定向仍然不起作用。 – itsclarke

+0

header.php中是否有输出?像HTML一样? –

+0

我也为你添加了我的header.php – itsclarke