programing

경고: 헤더 정보를 수정할 수 없습니다. 헤더는 이미 ERROR에 의해 전송되었습니다.

goodjava 2023. 2. 3. 20:09

경고: 헤더 정보를 수정할 수 없습니다. 헤더는 이미 ERROR에 의해 전송되었습니다.

저는 이 오류로 인해 한동안 어려움을 겪고 있습니다.

처음에는 그냥 공백이라고 생각했는데, 좀 더 조사해 보니 다음과 같은 문제가 있을 것 같습니다.

이 헤더 스테이트먼트 전에 사용자에게 출력을 송신할 수 있는 스테이트먼트를 찾습니다.하나 또는 여러 개를 찾으면 코드를 변경하여 헤더 문을 이전으로 이동합니다.복잡한 조건문은 문제를 복잡하게 만들 수 있지만 문제를 해결하는 데 도움이 될 수도 있습니다.가능한 한 빨리 헤더 값을 결정하고 이를 설정하는 PHP 스크립트의 맨 위에 있는 조건식을 고려해 보십시오.

include 헤더가 헤더와 함께 문제의 원인이라고 생각합니다만, 이 에러를 해소하기 위해서 코드를 재배치하는 방법을 알 수 없습니다.

오류를 제거하려면 어떻게 해야 하나요?

<?php
    $username = $password = $token = $fName = "";

    include_once 'header.php';

    if (isset($_POST['username']) && isset($_POST['password']))
        $username = sanitizeString($_POST['username']);

    $password = sanitizeString($_POST['password']); //Set temporary username and password variables
    $token    = md5("$password"); //Encrypt temporary password

    if ($username != 'admin')
    {
        header("Location:summary.php");
    }
    elseif($username == 'admin')
    {
        header("Location:admin.php");
    }
    elseif($username == '')
    {
        header("Location:index.php");
    }
    else
        die ("<body><div class='container'><p class='error'>Invalid username or password.</p></div></body>");

    if ($username == "" || $token == "")
    {
        echo "<body><div class='container'><p class='error'>Please enter your username and password</p></div></body>";
    }
    else
    {
        $query = "SELECT * FROM members WHERE username='$username'AND password = '$token'"; //Look in table for username entered
        $result = mysql_query($query);
        if (!$result)
            die ("Database access failed: " . mysql_error());
        elseif (mysql_num_rows($result) > 0)
        {
            $row = mysql_fetch_row($result);
            $_SESSION['username'] = $username; //Set session variables
            $_SESSION['password'] = $token;

            $fName = $row[0];
        }
    }
?>

장기적으로는 PHP 스크립트의 모든 출력을 변수에 버퍼링해야 합니다.여기에는 헤더와 본문 출력이 포함됩니다.그런 다음 스크립트의 마지막에 필요한 출력을 수행합니다.

문제의 가장 빠른 해결 방법은 다음과 같습니다.

ob_start();

이 스크립트에서만 필요한 경우 스크립트의 첫 번째 항목으로 지정합니다.모든 스크립트에 필요한 경우 헤더에 첫 번째 항목으로 추가합니다.php 파일.

그러면 PHP의 출력 버퍼 기능이 활성화됩니다.PHP에서는 무언가를 출력할 때(에코 또는 인쇄를 실행) HTTP 헤더를 전송해야 합니다.출력 버퍼링을 켜면 스크립트로 출력할 수 있지만, PHP는 버퍼가 플러시될 때까지 헤더를 전송할 필요가 없습니다.이 기능을 켜고 끄지 않으면 스크립트 실행이 완료된 후 PHP가 버퍼에 있는 모든 항목을 자동으로 플러시합니다.대부분의 경우 전원을 켜기만 해도 전혀 문제가 되지 않으며 구성에 따라서는 성능이 약간 향상될 수 있습니다.

php.ini 컨피규레이션파일을 변경할 수 있는 접근권이 있는 경우 다음을 검색하여 변경 또는 추가할 수 있습니다.

output_buffering = On

그러면 ob_start()를 호출할 필요 없이 출력 버퍼링이 꺼집니다.

출력 버퍼링에 대한 자세한 내용은http://http://php.net/manual/en/book.outcontrol.php 를 참조해 주세요.

에 체크하다echo,print()또는printr()인크루드 파일에서header.php.

이것이 문제일 수도 있고 MVC 파일이 있는 경우 다음 시간 이후에 공백 수를 확인합니다.?>이것 또한 문제가 될 수 있습니다.

에 몇 가지 문제가 있습니다.header()콜, 그 중 하나가 문제의 원인일 수 있습니다.

  • 이거를 넣어야 되는데exit()각 후에header("Location:그렇지 않으면 코드 실행이 계속됩니다.
  • 다음 시간 이후에 공간이 있어야 합니다.:라고 쓰여 있다"Location: http://foo"
  • 에서 상대 URL을 사용할 수 없습니다.Location헤더와 같은 절대 URL을 형성해야 합니다.http://www.mysite.com/some/path.php

콘텐츠를 출력한 후 헤더 정보를 보내려고 합니다.

이를 수행하려면 출력 버퍼링을 찾습니다.

따라서 다음을 사용하십시오.ob_start();

언급URL : https://stackoverflow.com/questions/9707693/warning-cannot-modify-header-information-headers-already-sent-by-error