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* を呼び出して) ヘッダーを送信しようとしていることです。これは、*session_start* を呼び出す前に発生した、HTML/空白/エラー メッセージなどからのものである可能性があります。

HTTP プロトコルでは、これらのヘッダーは要求/応答の本文の前に来る必要があり、誤って出力の送信を開始したため、既に本文にあり、ヘッダーに戻ることはできません。

解決策の 1 つは、何かを行う前に必ず *session_start* を呼び出すことです。もう 1 つのオプションは、ob_start()などの出力バッファリング関数を使用して、念のため出力をバッファリングすることです。


これを引き起こしている実際に何が起こっているのか疑問に思っている場合に備えて、session_start が通常何をするかについて簡単に説明します... PHP セッションの通常の動作は、関数session_satrt()を呼び出すときに 3 つのことを行うことです。

  1. セッション ハンドラーは、クライアントがセッション IDを提供したかどうかを確認します (通常は、指定されたsession.nameを使用して HTTP 要求ヘッダーで Cookie を送信します)。見つかった場合、セッション ハンドラーはそのセッションを開きます (既定では、それはファイルです。存在しない場合は作成されます)。クライアントからセッション IDが提供されない場合、ランダムなセッション ID が生成され、そのセッション ファイルが開かれます。
  2. セッション ハンドラは、セッション ファイルで見つかったすべてのデータを$_SESSIONスーパーグローバル変数に取り込みます (つまり、セッションは de-serializedです)。
  3. ステップ 1 でセッション ID (セッション Cookie) が提供されなかった場合、セッション ハンドラーは HTTP 応答と共に送信されるSet-Cookieヘッダーを設定します。
于 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_startHTTP ヘッダーで情報を送信します (実際のコンテンツが送信される前に、ブラウザーに送信される情報の一部)。すでにコンテンツをブラウザーに送信している場合、たとえば、かなりの数の HTML コードの場合、サーバーはその情報をヘッダーで送信できません。それらは既になくなっています。HTTP プロトコルの詳細を読んで、全体をよりよく理解してください。

于 2012-12-06T10:55:09.683 に答える
1

session_start();ファイルの先頭に移動します。

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