0

Could you please help me? My website does not set the following simple cookie. Although some other login scripts does but this one does not work. Thanks

test.php

...

<form action="test2.php" method="post">
        Email: <br />
        <input type="email" name="email" value=""/> <br />
        <input type="submit" name="submit" value="Next"/> 
</form>

...

test2.php

<?php ob_start(); ?>

<?php
// call the header of the page
require('header.html');

// connect to database
require "connect.php";
?>

<?php
    $email = $_POST['email'];

    // set cookie
    $one_hour = time() + 3600;
    $set = setcookie(user_email, $email, $one_hour);

    if($set == TRUE) {
        print '<p> Cookie set</p>';
    } else {
        print '<p> Cookie not set</p>';
    }

// call footer of the page
require('footer.html');
?>

<?php ob_flush(); ?>

After running the above scripts, I get this error:

Warning: Cannot modify header information - headers already sent by (output started at /websites/public_html/test2.php:1) in /websites/public_html/test2.php on line 16

Cookie not set

  • PS: Line 16 on my script is "$set = setcookie(email_noaccount, $email, $hr);"
Sarah Hamed
  • 119
  • 2
  • 4
  • 10
  • Do you have to separate php code tag? New line out side the tag is mean `echo '';` before `setcookie` that make error – bitoshi.n May 19 '12 at 12:36
  • 1
    possible duplicate of [Headers already sent by PHP](http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) – mario May 19 '12 at 12:37
  • As the warning said, your problem is in line 1, not in line 16. – mario May 19 '12 at 12:39
  • Once the headers are sent (e.g. on the output) you cannot modify them anymore. If setting `ob_start()` before all output does not help, I suggest you to check if you are not saving test2.php with UTF-8 BOM. As far as I know Notepad++ has the option to save the file "Without UTF-8 BOM", so that might help. – Tautvidas S May 19 '12 at 13:07

2 Answers2

2

just change above code in following way and try, put ob_start() after require()

<?php
require "connect.php";
require('header.html');
?>
<?php ob_start(); ?>
mack
  • 1,768
  • 5
  • 21
  • 28
0

You're sending content to the output buffer before you need to:

<?php ob_start(); ?>
  <--- right here
<?php
// call the header of the page
require('header.html');

// connect to database
require "connect.php";
?>
  <--- and right here
<?php
    $email = $_POST['email'];

You should get rid of that unnecessary whitespace in the output so you can conduct your server-side processing (including header modification) before building output.

Ideally, you don't want to mix the two. The server-side processing should occur before the output is built, then the output would be built using the results of the processing and sent to the client.

David
  • 208,112
  • 36
  • 198
  • 279