4

可能重复:
PHP 中的“警告:标头已发送”

当我将其上传到服务器时,我的 PHP 登录表单上会显示一个错误。它在我的本地主机上运行良好,但是当我将它上传到服务器时,它给了我这个错误:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/shopping/public_html/biblioteka/index.php:10) in /home/shopping/public_html/biblioteka/index.php on line 45

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/shopping/public_html/biblioteka/index.php:10) in /home/shopping/public_html/biblioteka/index.php on line 45

Warning: Cannot modify header information - headers already sent by (output started at /home/shopping/public_html/biblioteka/index.php:10) in /home/shopping/public_html/biblioteka/index.php on line 49

这是我的 PHP 代码:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" type="text/css" href="http://localhost/Shopping_biblioteka/css/style.css">
        <title>Title</title>
    </head>
    <body align="center">
        <div id="login">
        <?php
    
        if (isset($_POST['username']) && isset($_POST['password'])) {
            $username = $_POST['username'];
            $password = $_POST['password'];
            mysql_connect("localhost", "user", "pass") or die(mysql_error());
            mysql_select_db("db") or die(mysql_error());
        mysql_query("SET CHARACTER SET utf8");
        mysql_query("SET NAMES utf8");
            $result = mysql_query("SELECT password,id FROM x9qg6_users
            where username='" . $username . "'");
            if (!$result) {
                echo 'Could not run query: ' . mysql_error();
                exit;
            }
            $row = mysql_fetch_row($result);
            $test = explode(":", $row[0]);
            $user_id=$row[1];
            $userhash = md5($password . $test[1]);
            if ($test[0] === $userhash) {       
                session_start();
                $_SESSION['login_user'] = $user_id;
                $_SESSION['username'] = $username;
                $url = "biblioteka.php";
                header("Location: $url");
            }
        } else {
            echo 'Внесете ги вашите податоци во полињата!';
        }
        // Connects to your Database 
        ?> 
        <form action="" method="POST" accept-charset="UTF-8"> 
            Корисничко име:<br/>
            <input name="username" id="username" type="text"/><br/>
            Лозинка:<br/>
            <input type="password" id="password" name="password"/><br/>
            <input type="submit" value="Логирај се!"/>
        </form>

        </div>
    </body>
</html>
4

5 回答 5

6

只需在session_start( )之后添加ob_start( )

<?php
session_start();
ob_start();
?>
<!DOCTYPE html>
<html>
    <head>
       ...
       ...
于 2012-12-06T11:03:29.437 回答
4

是的,您的问题是您在发送一些输出后尝试发送标头(通过调用 *session_start*)。这可能是来自 HTML/whitespace/error-messages/etc.. 在您调用 *session_start* 之前发生的任何内容。

在 HTTP 协议中,这些标头必须位于请求/响应的正文之前,并且由于您无意中开始发送输出,因此您已经在正文中并且无法返回标头。

一种解决方案是始终确保在执行任何其他操作之前调用 *session_start*。另一种选择是使用像ob_start()这样的输出缓冲函数来缓冲任何输出以防万一。


以防万一您想知道究竟是什么导致了这种情况,这里简要解释一下 session_start 通常会做什么...... PHP 会话的正常行为是在您调用函数session_satrt()时做 3 件事

  1. 会话处理程序检查客户端是否提供了会话 ID(通常通过在 HTTP 请求标头中发送具有指定session.name的 cookie )。如果找到一个,会话处理程序将打开该会话(默认情况下这是一个文件——如果它不存在,则创建它)。如果客户端没有提供会话ID,则会生成随机会话 ID 并打开该会话文件。
  2. 然后,会话处理程序将在会话文件中找到的任何数据填充到$_SESSION超级全局变量中(即会话被反序列化)。
  3. 如果在步骤 1 中没有提供会话 ID(会话 cookie),则会话处理程序设置一个Set-Cookie标头以与 HTTP 响应一起发送。
于 2012-12-06T11:11:26.867 回答
1

在发送标头之前,您不得向页面输出任何内容

或使用输出缓冲

ob_start();
于 2012-12-06T10:53:20.883 回答
1

确保在or调用之前不发送任何内容(甚至不发送空格) :session_start()header()

<?php
     ...
     session_start();
     ...
     header();
     ...

?>
<!-- HTML code -->

更多信息可以在session_start文档页面上找到。

session_start将在 HTTP 标头中发送信息(在发送任何实际内容之前发送到浏览器的一条信息)。如果您已经向浏览器发送了内容,例如在您的情况下有相当多的 HTML 代码,则服务器无法在标题中发送该信息:它们已经消失了。阅读更多关于HTTP 协议的内容,以更好地理解整个事情。

于 2012-12-06T10:55:09.683 回答
1

移动session_start();到文件顶部。

<?php
session_start();
?>
<!DOCTYPE html>
<html>
    <head>
       ...
       ...
于 2012-12-06T10:56:42.180 回答