PHP警告:无法修改标头信息

时间:2012-10-11 08:52:54

标签: php

我有一个php登录功能。当我尝试使用正确的用户登录时,它会显示如下错误:

警告:无法修改标题信息 - 已在第150行的/home/hapshou1/public_html/index.php中发送的输出(/home/hapshou1/public_html/index.php:15上的输出)

-

include "config.php";

if($_SERVER["REQUEST_METHOD"] == "POST")
{
    function antiinjection($data)
    {
        $filter_sql = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($data,ENT_QUOTES))));
        return $filter_sql;
    }

    $username = antiinjection($_POST['username']);
    $pass = antiinjection($_POST['password']);

    $login=mysql_query("SELECT username, password FROM user WHERE (username='$username' OR email='$username') AND password='$pass'");
    $found=mysql_num_rows($login);
    $r=mysql_fetch_array($login);

    if
    ((!empty($username)) &&
    (!empty($pass)))
    {
        if ($found > 0)
        {
            session_register("username");
            session_register("password");

            $_SESSION[username]     = $r[username];
            $_SESSION[password]     = $r[password];

            date_default_timezone_set("Asia/Jakarta");
            $date_log = date("j-F-Y, G:i ");

            mysql_query("update user set status='online', date_logged_in='$date_log' WHERE username='$_SESSION[username]'");
            header('location:home');
        }
        else
        {
            echo '<div class="error_log">
                    <p>Wrong username or password. Please try again.</p>
                </div>';
        }
    }
    else
    {
        echo '
            <div class="error_log">
                <p>Username and password are required.</p>
            </div>
        ';
    }
}

我的代码出了什么问题?

4 个答案:

答案 0 :(得分:3)

那么,看看第15行的内容。

最可能的情况是此声明导致输出:

$found=mysql_num_rows($login);

这又是由于您的mysql_query返回false而导致的。

你可以考虑这个来报告任何错误:

if (false === ($login=mysql_query("SELECT username, password FROM user WHERE (username='$username' OR email='$username') AND password='$pass'"))) {
    die(mysql_error());
}

不建议在生产环境中使用die()这样的语句,因此请考虑使用记录器

顺便说一下,学习如何使用PDO / mysqli; PDO有一种模式,可以将所有错误转化为异常,这有助于我更快地发现错误。

答案 1 :(得分:0)

ob_start();放在代码顶部,并将ob_flush();放在最后

始终在exit();重定向

之后放置header

答案 2 :(得分:0)

将您的代码包含在

 ob_start();

...



ob_flush();

发生此错误的原因是,当请求设置标头值时,网页正文的某些部分已经发送给用户。

同样总是将exit();放在header()语句之后,以便在header()调用之后当前页面上的其余代码不会被执行。

答案 3 :(得分:0)

例证header('Location: http://www.example.com/');

Naga,试试这段代码:

   session_start();
date_default_timezone_set("Asia/Jakarta");
include "config.php";

if(isset($_POST['username']) && isset($_POST['password']))
{
    function antiinjection($data)
    {
        $filter_sql = mysql_real_escape_string(stripslashes(strip_tags($data)));
        return $filter_sql;
    }

    $username = antiinjection($_POST['username']);
    $pass     = antiinjection($_POST['password']);

    $login = mysql_query("SELECT username, password FROM user WHERE (username='$username' OR email='$username') AND password='$pass'");
    $r     = mysql_fetch_array($login);

    if((!empty($username)) && (!empty($pass)) && is_array($r))
    {
        if (count($r) > 0)
        {
            $_SESSION['username'] = $r['username'];
            $_SESSION['password'] = $r['password'];
            $date_log = date("j-F-Y, G:i");
            mysql_query("UPDATE user SET status = 'online', date_logged_in = '$date_log' WHERE username = '$_SESSION[username]'");
            header('Location: http://domen.com/');
        }
        else
        {
            echo '<div class="error_log">
                    <p>Wrong username or password. Please try again.</p>
                </div>';
        }
    }
    else
    {
        echo '
            <div class="error_log">
                <p>Username and password are required.</p>
            </div>
        ';
    }
} else {
    // do some action
}