Page 1 of 1

Cannot modify header information - headers already sent by

Posted: Sat Apr 09, 2011 2:54 am
by liyun88
hi,i face some error..that is Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\nagels\saveComment.php:18) in C:\xampp\htdocs\nagels\saveComment.php on line 19
when the user is not the member,it pop out message to register a member but after i click ok button,it show the error above..isnt i use echo function,so get the error??
can anyone help me to check and correct it??tthanks in advance..

the one is saveComment.php

Code: Select all

<?php

require_once 'config.php' ;


 $id = $_REQUEST['id'];
$username = $_REQUEST["username"];
$comment = $_POST["comment"];
if ($id = $_REQUEST['id'])
{
$query = 'INSERT INTO comment set id =  "' . mysql_real_escape_string($id) . '",
username =  "' . mysql_real_escape_string($username) . '", 
comment =  "' . mysql_real_escape_string($comment) . '",date = "' . date('Y-m-d H:i:s') . '"'; 
$result = mysql_query($query);  
header("Location:comment2.php");
}
else{ 
  echo"<script>alert(\"Please register as member to comment\")</script>";
 header("Location: register.php");
  }
  

?>
same problem i get that are Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\nagels\deleteComment.php:2) in C:\xampp\htdocs\nagels\application.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\nagels\deleteComment.php:2) in C:\xampp\htdocs\nagels\application.php on line 50

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\nagels\deleteComment.php:2) in C:\xampp\htdocs\nagels\application.php on line 51

before that i use like that,everything is ok..but recently i get this problem again..i already change and correct many time still same error.
what wrong wif my code??
the one is application.php

Code: Select all

<?php
session_start();
require_once 'config.php' ;




function redirect($url, $num = 307) {
   static $http = array (
       100 => "HTTP/1.1 100 Continue",
       101 => "HTTP/1.1 101 Switching Protocols",
       200 => "HTTP/1.1 200 OK",
       201 => "HTTP/1.1 201 Created",
       202 => "HTTP/1.1 202 Accepted",
       203 => "HTTP/1.1 203 Non-Authoritative Information",
       204 => "HTTP/1.1 204 No Content",
       205 => "HTTP/1.1 205 Reset Content",
       206 => "HTTP/1.1 206 Partial Content",
       300 => "HTTP/1.1 300 Multiple Choices",
       301 => "HTTP/1.1 301 Moved Permanently",
       302 => "HTTP/1.1 302 Found",
       303 => "HTTP/1.1 303 See Other",
       304 => "HTTP/1.1 304 Not Modified",
       305 => "HTTP/1.1 305 Use Proxy",
       307 => "HTTP/1.1 307 Temporary Redirect",
       400 => "HTTP/1.1 400 Bad Request",
       401 => "HTTP/1.1 401 Unauthorized",
       402 => "HTTP/1.1 402 Payment Required",
       403 => "HTTP/1.1 403 Forbidden",
       404 => "HTTP/1.1 404 Not Found",
       405 => "HTTP/1.1 405 Method Not Allowed",
       406 => "HTTP/1.1 406 Not Acceptable",
       407 => "HTTP/1.1 407 Proxy Authentication Required",
       408 => "HTTP/1.1 408 Request Time-out",
       409 => "HTTP/1.1 409 Conflict",
       410 => "HTTP/1.1 410 Gone",
       411 => "HTTP/1.1 411 Length Required",
       412 => "HTTP/1.1 412 Precondition Failed",
       413 => "HTTP/1.1 413 Request Entity Too Large",
       414 => "HTTP/1.1 414 Request-URI Too Large",
       415 => "HTTP/1.1 415 Unsupported Media Type",
       416 => "HTTP/1.1 416 Requested range not satisfiable",
       417 => "HTTP/1.1 417 Expectation Failed",
       500 => "HTTP/1.1 500 Internal Server Error",
       501 => "HTTP/1.1 501 Not Implemented",
       502 => "HTTP/1.1 502 Bad Gateway",
       503 => "HTTP/1.1 503 Service Unavailable",
       504 => "HTTP/1.1 504 Gateway Time-out"
   );
   header($http[$num]);
   header("Location: $url");
   exit;
}





//SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;
//SELECT FOUND_ROWS();

function db_query_with_size($query)
{
  #add SQL_CALC_FOUND_ROWS
  $query = str_replace("SELECT", "SELECT SQL_CALC_FOUND_ROWS", strtoupper($query));
  $results = db_query($query);
  
  $result = db_query("SELECT FOUND_ROWS()");
  $result = mysql_fetch_row($result);
  return array("result" => $results, "size" => $result[0]); 
}






function set_flash_note($message)
{
  $_SESSION["flash_note"] = $message;
}

function get_flash_note()
{
  
  $note = $_SESSION['flash_note'];
  unset($_SESSION['flash_note']);
  return $note; 
}

function get_id()
{
  return mysql_insert_id();
}

function findexts($filename) 
{ 
  
  $filename = strtolower($filename) ; 
  
  $exts = explode(".", $filename) ; 
  
  $n = count($exts)-1; 
  
  $exts = $exts[$n]; 
  
  return $exts; 

}

function is_login()
{
  if(array_key_exists('login',$_SESSION) && $_SESSION['login'] )
    return true;
  return false;
} 


?>
the one is deleteComment.php

Code: Select all

<?php
session_start();
require_once 'config.php';
require_once 'application.php' ;

$comment_id=$_REQUEST['comment_id'];
$id=$_SESSION['id'];

$sql = 'DELETE * FROM comment WHERE comment_id="$comment_id", id="$id"';
mysql_query( $sql);

redirect("comment2.php");
?>

Re: Cannot modify header information - headers already sent

Posted: Sat Apr 09, 2011 11:19 am
by McInfo
In a related post, I explained how headers are used and that headers must come before the response body. Both header() and session_start() write to the headers part of the response, so they cannot come after any data written to the body either explicitly by an echo statement or implicitly by dropping out of PHP mode.

Re: Cannot modify header information - headers already sent

Posted: Sat Apr 09, 2011 11:36 am
by liyun88
McInfo wrote:In a related post, I explained how headers are used and that headers must come before the response body. Both header() and session_start() write to the headers part of the response, so they cannot come after any data written to the body either explicitly by an echo statement or implicitly by dropping out of PHP mode.
sorry i am beginner.. i m not so understand about your explaination..can you explain more or give me more example for how headers are used and that headers must come before the response body?? but i already put them in the first after <?php tags...what wrong is it??
how about this Both header() and session_start() write to the headers part of the response, so they cannot come after any data written to the body either explicitly by an echo statement or implicitly by dropping out of PHP mode. i need to send the link page after pop out the message..
can you help me and teach me??thanks for your great help..

Re: Cannot modify header information - headers already sent

Posted: Sat Apr 09, 2011 12:54 pm
by McInfo
The PHP code is not part of the response. The server converts PHP code into data (plain text, HTML, image data, etc.). That data is part of the server's response.

The server can respond only once per client request. Telling your script to write to the output stream triggers one type of response. Telling your script to send a Location header triggers a different type of response. They are not compatible in that order.

A Location header works to redirect the browser because it tells the browser to make a second request. That is another reason that it doesn't make sense to send output before a redirect (aside from the limitations of HTTP previously described).

There are solutions for your problem involving JavaScript's window.location variable or HTML's <meta> tag. Search online for "javascript redirect" or "html meta refresh tag".

A better solution might be to design your application to channel all requests through a single controller script that includes the appropriate parts of your application based on the request. For example, if a visitor is not logged in or a login attempt fails, the controller would include the login form. If a login succeeds, the controller might include a confirmation page or home page instead.

Re: Cannot modify header information - headers already sent

Posted: Sat Apr 09, 2011 8:47 pm
by liyun88
i still cant solve my error...i already change and correct some code,but still cant solve them..the problem still have..
can anyone help me to correct them??thanks in advance..
the one is deleteComment.php

Code: Select all

<?php

require_once 'config.php';

$id=$_SESSION['id'];

$comment_id=$_REQUEST['comment_id'];


$sql = 'DELETE * FROM comment WHERE WHERE comment_id = ' . $comment_id;
mysql_query( $sql);

header("Location:comment2.php");
?>
the one is saveComment.php it gt javascript

Code: Select all

<?php
session_start();
require_once 'config.php' ;
require_once 'application.php';


 $id = $_SESSION['id'];
$username = $_SESSION["username"];
$comment = $_POST["comment"];
if ($id = $_SESSION['id'])
{
$query = 'INSERT INTO comment set id =  "' . mysql_real_escape_string($id) . '",
username =  "' . mysql_real_escape_string($username) . '", 
comment =  "' . mysql_real_escape_string($comment) . '",date = "' . date('Y-m-d H:i:s') . '"'; 
$result = mysql_query($query);  
redirect("comment2.php");
}
else{ 
  echo"<script>alert(\"Please register as member to comment\")</script>";
 window.location ="register.php";
  }
  

?>

Re: Cannot modify header information - headers already sent

Posted: Sun Apr 10, 2011 11:30 am
by McInfo
window.location is JavaScript, not PHP. It needs to be part of the output string and between the <script> tags.

Change this

Code: Select all

<?php
/* ...omitted... */
else {
    echo "<script>alert(\"Please register as member to comment\")</script>";
    window.location = "register.php";
}
to this.

Code: Select all

<?php
/* ...omitted... */
else {
    ?>
    <script type="text/javascript">
        window.alert('Please register as a member to comment.');
        window.location = 'register.php';
    </script>
    <?php
}

Re: Cannot modify header information - headers already sent

Posted: Sun Apr 10, 2011 12:10 pm
by liyun88
McInfo wrote:window.location is JavaScript, not PHP. It needs to be part of the output string and between the <script> tags.

Change this

Code: Select all

<?php
/* ...omitted... */
else {
    echo "<script>alert(\"Please register as member to comment\")</script>";
    window.location = "register.php";
}
to this.

Code: Select all

<?php
/* ...omitted... */
else {
    ?>
    <script type="text/javascript">
        window.alert('Please register as a member to comment.');
        window.location = 'register.php';
    </script>
    <?php
}
thanks ya..it works now..