moosey_man1988 Posted December 3, 2015 Share Posted December 3, 2015 (edited) Hi Guys I've across an issue With my project im working on and I cannot solve it When accessing my reports page I get this: Warning: Cannot modify header information - headers already sent by (output started at /var/www/virtual/crmtech.co.uk/minicrm/htdocs/header.php:104) in I have eliminated the issues down to my javascript scripts in the header :| but I just cannot work out why it would be causing the issue. here is the header.php <?php require ('secure/session.php'); require ('Functions/functions.php'); error_reporting(E_ALL); ini_set('display_errors', 1); ?> <!DOCTYPE html> <html> <head> <!--favicon--> <link rel="icon" href="<?php echo url();?>Images/favicon.ico" type="image/x-icon" /> <!--Style Sheets--> <link rel="stylesheet" type="text/css" href="<?php echo url();?>bootstrap/css/style.css"> <link rel="stylesheet" type="text/css" href="<?php echo url();?>bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="<?php echo url();?>bootstrap/css/custom.css"> <!--Script Links--> <script src="<?php echo url();?>bootstrap/js/jquery/jquery.js"></script> <script src="<?php echo url();?>bootstrap/js/bootstrap.min.js"></script> <script src="<?php echo url();?>bootstrap/js/typeahead/typeahead.js"></script> <script src="<?php echo url();?>bootstrap/js/bootstrap-datepicker/bootstrap-datepicker.js"></script> <!-- For Displaying Modals--> <script type="text/javascript"> $(".btn-group").find(':input:checked').parent('.btn').addClass('active'); </script> <!--This is the datepicker --> <script type="text/javascript"> $('.datepicker').datepicker({ format: 'mm/dd/yyyy', startDate: '-3d' }) </script> <!--lets use the better to typeahead for search forms --> <script type="text/javascript"> $(function (){ $("#typeaheadCust").typeahead({ source: function(customer, process) { $.ajax({ url: '<?php echo url();?>Functions/Getter.php', type: 'POST', data: 'customer=' + customer, dataType: 'JSON', async: true, success: function(data) { process(data); } }); } }); }); </script> and here is the my reporting/main.php page <?php //this is going to be the main section for reporting include('../header.php'); //lets check the user is authorised to be here! if ($userLevel > 3){ echo "you are authorised to be here!"; } else { echo "you are not allowed here naughty!"; //sleep(10); echo "lets send you here ". SERVER_PATH; header('Location: ../index.php'); } ?> here is the page result, sorry i had to delete the server path Any help would be massively appreciated Thanks! Edited December 3, 2015 by moosey_man1988 Quote Link to comment Share on other sites More sharing options...
mac_gyver Posted December 3, 2015 Share Posted December 3, 2015 (edited) this is a very common error. if you had searched for it (there's even a thread from this time yesterday with the same error - http://forums.phpfreaks.com/topic/299626-cannot-modify-header-information/ ) you would have found what it means. YOU CANNOT SEND ANYTHING* TO THE BROWSER BEFORE YOU USE A HEADER(), SESSION_START(), OR SETCOOKE() STATEMENT. the http protocol REQUIRES that any 'control' headers be sent to the browser before you send anything else to the browser. * - anything includes a BOM (Byte Order Mark) character that your editor saved at the start of your file, any characters outside of <?php ?> tags, even if those characters are white-space characters that you cannot see or are not rendered for display by the browser, the <doctype tag and any other html/javascrpt/css markup are CHARACTERS being sent to the browser, anything your php code echos, prints, var_dump()s, or print_r()s, or anything that php outputs, such as a php error message. your php header() statement must be located in your code before you start sending the html/javascript/css to the browser. your page control logic that determines what to do on the page, or even if you are going to stay on the page, should be near the start of your code. you should only produce and send html/javascript/css to the browser after you have determined if you are even going to stay on the page. edit: see the following post for a suggested page layout that will help make your code fool proof - http://forums.phpfreaks.com/topic/297824-database-issues-and-working/?do=findComment&comment=1519095 your page access level check/header() redirect would be part of item #3 in that page layout. all your code for producing and outputting the web page would fall under items 5-8 in that list. Edited December 3, 2015 by mac_gyver Quote Link to comment Share on other sites More sharing options...
moosey_man1988 Posted December 3, 2015 Author Share Posted December 3, 2015 Okay which is a bit of a problem as multiple funtionc are used by the javascript in the header :| so maybe I will have to make a redirect function instead as a work around? Quote Link to comment Share on other sites More sharing options...
mac_gyver Posted December 3, 2015 Share Posted December 3, 2015 the <head></head> section of your html document doesn't have anything to do with this. this concerns the http protocol and what gets sent back and forth between the browser and the server before you send any character of data between the two. Quote Link to comment Share on other sites More sharing options...
Solution cyberRobot Posted December 3, 2015 Solution Share Posted December 3, 2015 (edited) As mac_gyver mentioned, nothing can be outputted to the screen before calling header(). Since you're just redirecting the user, the header() call can be moved to the top of your script. <?php //lets check the user is authorised to be here! if ($userLevel > 3){ echo "you are authorised to be here!"; } else { header('Location: ../index.php'); exit; } //this is going to be the main section for reporting include('../header.php'); ?> Note that I added the "exit" statement after the header() call to prevent the script from doing any further processing. If you want to display a message before the page is redirects, you could look into using header() and "refresh". An example can be found here: http://php.net/manual/en/function.header.php#97114 Edited December 3, 2015 by cyberRobot Quote Link to comment Share on other sites More sharing options...
moosey_man1988 Posted December 3, 2015 Author Share Posted December 3, 2015 Wow I cant believe how simple that is! haha I even wrote this a work around function usercheck($userlevel){ if ($userlevel > 3){ echo "you are authorised to be here!"; } else { $url = url(). "/dashboard.php"; die('<script type="text/javascript">window.location.href="' . $url . '?error=you are not Authorised to be here";</script>'); } } and then just called that function but i think it would be a wiser option to put the command before the header Thanks guys, sometimes it just takes a different pair of eyes to look at something differently or properly in this case Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.