This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Headers already sent by PHP
I am trying to write a JSON API for an app that I am making. It's in PHP. At the beginning of the PHP script I try to check if all the GET parameters are present, if not, then the server should send a 400 - Bad Request header.
the code looks like this:
//CHECK CONDITIONS
if (isset($GET["clat"]) && isset($GET["clng"]) && isset($GET["limit"]))
{
//do stuff
} else {
header( "HTTP/1.0 400 Bad Request");
exit;
}
The server simply serves an empty page with the 200 - OK header. So I tested it on another webserver and there it does seem to work.
So apparently there's something wrong with the server. How do I go around debugging this issue?
EDIT
I seem to have found the line causing the header to always be 200-OK. At the beginning of the PHP I include another php file with some mySQL Connection parameters. When I comment out the include 'setup.php'; line it works. the setup.php contains the following:
// Connects to Our Database
mysql_connect("#####", "#####", "######") or die(mysql_error());
mysql_select_db("####") or die(mysql_error());
How do I remain the external DB info include while being able to send a different HTTP Header afterwards?
Thanks in advance.
Check if you're included files doesn't have UTF BOM at the beggining of file and any text after closing ?>, because if there is any, PHP will automatically send headers
header( "HTTP/1.0 400 Bad Request", true, 400);
Try this way:
<?php
header("Status: 400 Bad Request");
?>
Related
Assume I have a form on index.php and it points to test.php which process the data submitted.
index.php looks like the below:
<form action="test.php"></form>
It should cause an error if test.php looks like the below:
( As you can see, there is already an output Nice being sent before the header () )
echo 'Nice';
header ( "Location: https://example.com" );
But what if I put it inside a function and call the function?
echo 'Nice';
function process () {
header ( "Location: https://example.com" );
}
process ();
Would it works in this case since it's inside a function, and would it cause an error?
As stated here:
https://www.php.net/manual/en/function.header.php
Remember that header() must be called before any actual output is
sent, either by normal HTML tags, blank lines in a file, or from PHP.
It is a very common error to read code with include, or require,
functions, or another file access function, and have spaces or empty
lines that are output before header() is called. The same problem
exists when using a single PHP/HTML file.
So the problem would arise only because you called it after echoing text to the response while you had to do it before.
header ( "Location: https://example.com" );
echo 'Nice';
Calling it inside a function doesn't change that requirement, because the header is part of the response that you already sent echoing text.
Short answer:
header ( "Location: https://example.com" );
To:
echo "<script> window.location.href='https://example.com </script>" ;
The issue is that you are sending an output for the user to see "Nice!" before setting the redirect header. When you send Nice! The server is forced to send the packets with a Header already. You have to learn more about how HTTP protocol works.
The header is like the label on the envelop when you mail it via postal service. The content "Nice" is like the letter inside the envelope. You are trying to send a letter to your friend and then change the label address after it arrives.
Instead for that kind of functionality what you could do is use HTML or Javascript to make the redirect. (HTML way is an obsolete way) so I gave you the Javascript. However this is not good way of writing code but it works and I do it all the time.
Since you seem to like to output things after redirecting user you might want to buffer your output or simply give some time for the redirect to process:
<?php
echo 'Nice';
?> <!--NOTICE I CLOSED PHP TAG -->
setTimeout(function() {
window.location.href = ‘https://example.com/’;
},5000);
Please wait while we redirect you in 5 seconds or simply <a href="https://example.com">click here.<a>
<?php
echo "I like to write PHP code";
?>
It's so refreshing to see a year 2000 style of coding and redirects. :)
Cheers! Very Nice!!!
It might be useful to understand why there is an error if you call header() at the wrong time.
The response from your web server to a browser looks something like this, with a status, then "headers", then a "body":
HTTP/1.1 200 OK
Content-Type: text/html
Nice
When you call header(), you are asking the server to add a line next to the Content-Type, before the "body". (And adding a Location header in particular also changes the status code in the very first line from 200 to 301 to indicate a redirect.) Roughly like this:
HTTP/1.1 301 Redirected
Content-Type: text/html
Location: https://example.com
Nice
If the server has already sent the first version, because you told it to output "Nice", there's no way for it to "take it back" and send the second version. That's just as true in your second code as in your first: you're telling the server to output "Nice", and then telling it to go back and edit the headers, but it's too late.
This question already has answers here:
How to fix "Headers already sent" error in PHP
(11 answers)
Closed 8 years ago.
I need help with redirecting using header.
My code:
<?php
if($fname != "") {
$query = mysql_query("UPDATE customer_address SET first_name='$fname',last_name='$lname',company='$company',company_id='$company_id',
address_1='$address_1',address_2='$address_2',city='$city',county='$county', post_code='$postcode',country='$country'
WHERE address_id='$editThisId';");
if($query==true) {
header('Location: address.php');
} else {
echo "Update Error!";
}
}
And I get the following error:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\eula\edit-address.php:72) in C:\xampp\htdocs\eula\edit-address.php on line 129
Pastebin for whole file: http://pastebin.com/vj2Mp7u0
Thanks in advance!
You are getting this error because your server already sent information to the client's browser - Headers need to be sent first before any HTML is transferred.
Simply put the code which is supposed to redirect the user at the very top of your file before any HTML or echo-calls.
Alternatively, you can call ob_start() at the top of your file to disable output buffering and send the page as a whole after every bit of your PHP code has executed.
You can not have any html content being displayed before the header, example:
<html>
...
<?php
// your code
header('Location: address.php');
?>
Try putting the php code, before any html content.
"Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file."
from
http://www.php.net/manual/en/function.header.php
You could also try moving your php to the top of the page (before any of the HTML) instead of the bottom. That way the php would look for if(isset($_POST['submit'])) before anything on the page is rendered.
Your redirects should work then I think.
This question already has answers here:
How to fix "Headers already sent" error in PHP
(11 answers)
Closed 9 years ago.
When i put my website online, all of the headers will not work. But when i built it, just on a local database etc. it worked "Works" fine.
I get this ERROR on the website currently:
Warning: Cannot modify header information - headers already sent by (output started at /customers/5/8/4/infuze.dk/httpd.www/index.php:22) in /customers/5/8/4/infuze.dk/httpd.www/includes/functions.php on line 16
I used my google foo a little and as far as i can understand is that i cant output any data before i use headers. But i dont thing that is the case here.
Here is the code i used in on the site.
if(empty($_GET['page'])){
header('location: index.php?page=homepage');
}
or at least one example
I usually get the error "Cannot modify header information - headers already sent by" when the page you're trying to redirect from contains information. Check to see if the script uses echo, include, require, etc., or contains HTML markup before the line at which you try to redirect.
<p>Hello!</p>
<?php
header('location: index.php?page=homepage');
?>
Will NOT work, because it sends the browser information before trying to redirect.
<?php
echo "Hi!";
header('location: index.php?page=homepage');
?>
Also won't work, because it also sends the browser information before trying to redirect.
<?php
header('location: index.php?page=homepage');
include('setup.txt');
?>
<h1>Amazing page!</h1>
WILL work, because it tries to send the browser information AFTER the redirect, but not before.
Headers won't redirect in the following conditions:
Any blank space is remaining in the file after ?> tag.
To avoid this, please avoid ending ?> tag (file end).
Please check whether, any echo or print statement is written accidentally.
Also, please check whether any HTML tag is remaining there.
If you follow, all this, your script will work.
Finally, in the starting of the file, put
ob_start()
This function will store all your page's output in a buffer and thus your redirection will work.
Try this;
<?php
ob_start();
// code
ob_end_flush();
?>
>> Call ob_start() at start of the script.
>> call ob_end_flush() at the end of script.
Thanks!
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Headers already sent by PHP
I have a PHP file which I'm using to check username and password. This part is working, but after successful login I would like to use header() to redirect to user panel page. This is the logged error that I'm getting:
[10-Dec-2012 12:25:26] PHP Warning: Cannot modify header information - headers already sent by (output started at /home2/jzperson/public_html/imes/php/login.php:10) in /home2/jzperson/public_html/imes/php/login.php on line 32
This is line 10:
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
And this is line 32:
header("Location: http://imes.jzpersonal.com/userpanel.html");
Any idea why?
You probably have some output echoed out before getting to the line 32 with your header call.
See description of the header function: http://php.net/manual/en/function.header.php
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
Clarifications
To clarify things a little bit, the redirection using header() is performed by including a raw location response-header field to the server response. When the receiving party reads the response and sees that header field, it drops the current response and issues another request to the destination you provided.
Now, headers always come at the top (head) of the server response. That's why they are called headers! If you output any content, PHP will immediately "prefix" it with default headers and it's not possible to add any more of them after this point. So, by attempting to set another header later in your code, you get an error:
Cannot modify header information - headers already sent
By outputting HTML at line 10 you can no longer issue any more headers, because they were already sent (prefixed to your HTML output).
You can find more information about headers here: http://www.faqs.org/rfcs/rfc2616.html
Basically, you need to check whether the user is logged in or not (and redirect) before anything is sent to the browser (before HTML). Your code, then, would look something like this:
<?php
...
if($loggedIn)
{
header("Location: http://imes.jzpersonal.com/userpanel.html");
exit();
}
?>
<html>
...
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
You are trying to write something before header statement
Remove any echo statements/html content before header statement. That should do the trick
You could also cheat and just use output buffering - at the very beginning of the script tree use ob_start(); to begin capturing the output. You can use headers and set cookies etc as much as you like then.
At the last line of the script tree use ob_end_flush(); to send the output. You can also grab it to a variable to further process if you wish with $buffer = ob_get_clean();
Although its not a solution as such it does allow for a more flexible coding environment AND it will solve your above problem.
Its best to flush and die if you are going to be sending a Location header:
ob_start();
/* very long snip */
header('Location: somepage.php');
ob_end_flush();
die();
This will prevent any further processing after the location change has been sent.
Just as a side note: When I speak of a script tree I mean the include path - like put the ob_start(); into a header file thats included before anything else and a footer file that flushes (and processes if required) the output buffer. Remembering, as highlighted above, that Location changes should have the script halted immediately after.
Sessions may also need to be closed with a header Location followed by a die - to use that simply
ob_start();
/* very long snip */
header('Location: somepage.php');
ob_end_flush();
session_write_close();
die();
I found that one out after hours of wondering why session data was being lost! Bear that on mind.
You can't use header(); if anything has already been sent as output. This means HTML. Do all your PHP processing first, then output your HTML/JS.
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
How can one check to see if a remote file exists using PHP?
I want to programatically check if a website is live or not. I know i can do this by opening the url using "cURL" or "fopen" but it takes a lot of time because it needs to fetch the full page.
Furthermore, this method is not reliable because there can be other reasons like unsupported protocols to be able to open the website.
Is there any other way??
You could simply use HEAD request to get only the headers of the page and not the whole page. Still, the website will still generate the full page but at least you won't download everything.
To achieve this, you can use many methods, just check how to change the headers of the request and instead of doing a GET, you can do a HEAD.
fopen() and fread() do not read the entire webpage (not necessarily anyway). You can use that and read only a few bytes to determine the website exists (200 OK).
You could just send a header request and check the http response codes?
$file = 'http://www.test.com/idontexist.jpg';
$file_headers = #get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
}
else {
$exists = true;
}