Warning: Cannot modify header information - headers already sent
Happens when your script tries to send an HTTP header to the client but there already was output before, which resulted in headers to be already sent to the client.
This is an E_WARNING
and it will not stop the script.
A typical example would be a template file like this:
<html>
<?php session_start(); ?>
<head><title>My Page</title>
</html>
...
The session_start()
function will try to send headers with the session cookie to the client. But PHP already sent headers when it wrote the <html>
element to the output stream. You'd have to move the session_start()
to the top.
You can solve this by going through the lines before the code triggering the Warning and check where it outputs. Move any header sending code before that code.
An often overlooked output is new lines after PHP's closing ?>
. It is considered a standard practice to omit ?>
when it is the last thing in the file. Likewise, another common cause for this warning is when the opening <?php
has an empty space, line, or invisible character before it, causing the web server to send the headers and the whitespace/newline thus when PHP starts parsing won't be able to submit any header.
If your file has more than one <?php ... ?>
code block in it, you should not have any spaces in between them. (Note: You might have multiple blocks if you had code that was automatically constructed)
Also make sure you don't have any Byte Order Marks in your code, for example when the encoding of the script is UTF-8 with BOM.
Related Questions:
To help you out here... (too long for a comment)
Your require("config.php");
should contain the following:
Sidenote: Use the proper settings for your host.
$link = mysqli_connect("localhost", "username", "mpassword", "database") or die($link);
Then changing your escape functions to use the mysqli_
version of it and passing the connection parameter to it:
$name = mysqli_real_escape_string($link, $_POST['name']);
$lname = mysqli_real_escape_string($link, $_POST['lname']);
$uname = mysqli_real_escape_string($link, $_POST['uname']);
$email1 = mysqli_real_escape_string($link, $email1);
$email2 = mysqli_real_escape_string($link, $email2);
$pass1 = mysqli_real_escape_string($link, $pass1);
$pass2 = mysqli_real_escape_string($link, $pass2);
Again, same thing for the query. Using the i
version and passing connection to it as the first parameter.
mysqli_query($link, "INSERT INTO ...
Check for errors on your query using mysqli_error($link);
So you could modify the query to read as
$query = mysqli_query($link, "INSERT INTO ...
and doing
if(!$query){
echo "Error: " . mysqli_error($link);
}
Also read the following on Stack in regards to API mixing:
- Can I mix MySQL APIs in PHP?
- You can't.
mysql_
with mysqli_
or PDO etc. do NOT intermix together. You must use the same one from connecting to querying.
Footnotes.
Passwords
I also noticed that you may be storing passwords in plain text. This is not recommended. If you intend on going LIVE with this at some point, do NOT store passwords as plain text in your database.
Consult the following.
Other links:
Best Answer
mysql_*
functions have been removed in PHP 7.You probably have PHP 7 in XAMPP. You now have two alternatives: MySQLi and PDO.
Additionally, here is a nice wiki page about PDO.