2

Going to call mail within PHP server code then return back to HTML page. Wrote the following server code:

<!DOCTYPE HTML>
<HEAD>
    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
<BODY>
    <?php
    $referer = filter_input(INPUT_SERVER, 'HTTP_REFERER');  // real referrer detected
    // do something or nothing
    header("Location: $referer");
    ?>
</BODY>

This code produce an error "Warning: Cannot modify header information - headers already sent by...". Why?

Valery Bulash
  • 445
  • 4
  • 22
  • http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php being a possible duplicate. – Funk Forty Niner Mar 11 '17 at 20:39
  • The headers, as their name implies, are sent before the content. But when your PHP code executes, some content (the HTML before ` – axiac Mar 11 '17 at 21:33

2 Answers2

1

Your PHP code is in the middle of the HTML which is considered output. Once output has been generated, functions such as header() won't work anymore and will return an error. The solution is to move the php code to the top of the file, before any html.

<?php
$referer = filter_input(INPUT_SERVER, 'HTTP_REFERER');  // real referrer detected
// do something or nothing
header("Location: $referer");
?>
<!DOCTYPE HTML>
<HEAD>
    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
<BODY>
</BODY>
Asperitas
  • 339
  • 6
  • 13
1

header() in normal usage ,must be called before any actual output is sent,
                 and you already send data before using it .

☼►Solution  :   to manipulate that and have the ability to use header() wherever you want ..
then PHP has Output control functions which allow you to control when the output (such as HTML code) is being buffered in the server until you send it . so follow the Instructions down below :

by using ob_start in the beginning and ob_endin the end

✔ replace your code with this :

<?php
ob_start( );
?>
<!DOCTYPE HTML>
<HEAD>
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
<BODY>
<?php
$referer = filter_input(INPUT_SERVER, 'HTTP_REFERER');  // real referrer detected
// do something or nothing
header("Location: $referer");
?>
</BODY>

<?php
ob_end_flush( );
?>

Warning : make sure there is no Whitespace before <?php ob_start( );
or it will throw the same error .
.........................................

✘ - the wrong way :

  <?php
ob_start( ); ?>

✔ - the Right way :

<?php
ob_start( ); ?>
The Doctor
  • 636
  • 1
  • 7
  • 23