我的header()调用没有重定向到新页面

时间:2011-08-16 04:15:27

标签: php html redirect header

我在使用header方法重定向页面时遇到问题。我想我知道问题是什么。但我对PHP场景很新,所以我不知道还有什么可以尝试。根据我所读到的,如果页面已经在标头之前发送了数据,则不会触发header()方法。我觉得这可能是我问题的一部分,因为我在头函数之前有几个echo语句。它可能是别的吗?我该如何解决这个问题?

echo语句证明找到了正确的用户名和密码。我把一个测试echo语句放在标题所在的位置,它运行得很好。所以,我知道数据库正在找到正确的信息。插入信息时页面会刷新。谢谢你的期待。

<div id= "sidebar" >
    <div id="login-box">    
        <form name="client-login" action="<?php $_SERVER['PHP_SELF']; ?>"  method="post">
            <label id="user-lbl">Username:</label><br /><input type="text"
                name="username" id="username" /><br /> <label id="pass-lbl">Password:</label><br /><input
                type="password" name="password" id="password" /><br />     <label>&nbsp;</label><input
                type="submit" value="Login" class="submit" id="login" />
        </form>     
<?php 
$username = $_POST['username'];
$password = $_POST['password'];

if((!isset($username)) || (!isset($password))){

    echo "<p>Username is $username. Password is $password.</p>";

     }else{

    $mysql = mysql_connect("myhost", "username", "password");
    if(!$mysql){
    echo "<p>Cannot connect to database!</p>";}
    $selected = mysql_select_db("mydb", $mysql);
    if(!$selected){
    echo "<p>Cannot find database!</p>";}

    $query = sprintf("SELECT count(*) FROM users WHERE username = '%s' AND password = '%s'", mysql_real_escape_string($username),mysql_real_escape_string($password));

    $result = mysql_query($query, $mysql );
    if(!$result){
    echo "<p>Cannot run query.</p>";}

    $row  = mysql_fetch_row($result);
    $count = $row[0];
    if ($count > 0){
    header("Location: account.php"); die();} else {echo "<p>Invalid username or password!</p>";}
}  
?>

    </div><!-- #login-box -->

3 个答案:

答案 0 :(得分:4)

如果你打电话给header(),那么它应该被称为 BEFORE 将输出输出到HTML流的任何其他函数,或者在该文件中的任何HTML语句之前。在header()来电之前,您甚至无法发送换行符。

在您的情况下,首先您将<div id= "sidebar" >和其他7行发送到客户端,然后只调用header()函数。这就是你错误发生的原因。

原因:

header()调用旨在将HTTP标头信息传递给客户端浏览器。标头信息应该是要发送到客户端的第一个信息。如果您没有在PHP脚本中调用header(),PHP将在发送PHP文件的第一行之前自动发送标题信息。

发送标头后,您无法在同一PHP文件中发送另一个标头。因此,如果您想要专门发送标头,请在任何其他正文内容开始之前发送。

答案 1 :(得分:2)

是的,那是你的问题。

最好的解决方案是在向浏览器输出任何内容之前执行代码。除此之外,将ob_start();添加到脚本顶部将缓冲输出,即使在您打印/回显文本后也允许header();调用。

答案 2 :(得分:1)

使用php代码:

header('page url');

使用标题可能会在上传到服务器时出现问题。

使用javascript:

window.location='page url';