2

我有一个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

4 回答 4

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 有一种模式,在这种模式下,所有错误都可以转换为异常,这有助于我更快地找到错误。

于 2012-10-11T08:56:20.373 回答
0

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

总是放在重定向exit();之后header

于 2012-10-11T08:54:21.377 回答
0

将您的代码包含在

 ob_start();

...



ob_flush();

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

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

于 2012-10-11T08:54:58.757 回答
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
}
于 2012-10-11T09:13:00.543 回答