PHP错误:Warning: Cannot modify header information - headers already sent by ...

dedecms如何给每个内容页加canonical标签

若是在执行php程序时看到这条忠告:"Warning: Cannot modify header information - headers already sent by ...."

Few notes based on the following user posts:
有以下几种解决方式:

1. Blank lines (空缺行):
Make sure no blank line after <?php ... ?> of the calling php scrīpt.
检查有<?php ... ?> 后面没有空缺行,稀奇是include或者require的文件。不少问题是这些空缺行导致的。

2. Use exit statement (用exit来解决):
Use exit after header statement seems to help some people
在header后加上exit();
header ("Location: xxx");
exit();

3. PHP has this annoying problem, if your HTML goes before any PHP code or any header modification before redirecting to certain page, it ll said "Warning: Cannot modify header information - headers already sent by ...." Basically anytime you output to browser, the header is set and cannot be modified. So two ways to get around the problem:

3a. Use Javascrīpt (用Javascrīpt来解决):
<? echo "<scrīpt> self.location( file.php );</scrīpt>"; ?>
Since it s a scrīpt, it won t modify the header until execution of Javascrīpt.
可以用Javascrīpt来取代header。另外需要注重,接纳这种方式需要浏览器支持Javascrīpt.

3b. Use output buffering (用输出缓存来解决):
<?php ob_start(); ?>
... HTML codes ...
<?php
... PHP codes ...
header ("Location: ....");
ob_end_flush();
?>
This will save the output buffer on server and not output to browser yet, which means you can modify the header all you want until the ob_end_flush() statement. This method is cleaner than the Javascrīpt since Javascrīpt method assumes the browser has Javascrīpt turn on. However, there are overhead to store output buffer on server before output, but with modern hardware I would imagine it won t be that big of deal. Javascrīpt solution would be better if you know for sure your user has Javascrīpt turn on on their browser.

就像上面的代码那样,这种方式在天生页面的时刻缓存,这样就允许在输出head之后再输出header了。本站的许愿板就是接纳这种方式解决的header问题。

4.set output_buffering = On in php.ini (开启php.ini中的output_buffering )
set output_buffering = On will enable output buffering for all files. But this method may slow down your php output. The performance of this method depends on which Web server you re working with, and what kind of scrīpts you re using.
这种方式和3b的方式理论上是一样的。然则这种方式开启了所有php程序的输出缓存,这样做可能影响php执行效率,这取决于服务器的性能和代码的庞大度。

 

 

第二种:

若何彻底杜绝warning: Cannot add header information - headers already sent in…… 这种令人莫明其妙的的错误。 只要你写过PHP代码,信托都遇上过这个大多时刻都令人莫明其妙的warning吧..今天我们就来搞定它…………… 看了PHP手册,回覆如下:新闻“Warning: Cannot send session cookie - headers already sent…”或者“Cannot add/modify header information - headers already sent…”。 函数 header(),setcookie() 和 session 函数需要在输出流中增添头信息。然则头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的剧本是否已经发送了头信息。请参阅“输出控制函数”。 意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这谜底并不令人知足。由于往往程序在其他PHP环境下运行却正常。 首先:这错误是怎么发生的呢?让我们来看看PHP是若那边理HTTP header输出和主体输 
文讨论的是若何彻底杜绝warning: Cannot add header information - headers already sent in…… 这种令人莫明其妙的的错误。 
只要你写过PHP代码,信托都遇上过这个大多时刻都令人莫明其妙的warning吧..今天我们就来搞定它……………
看了PHP手册,回覆如下:
新闻“Warning: Cannot send session cookie - headers already sent…”或者“Cannot add/modify header information - headers already sent…”。

函数 header(),setcookie() 和 session 函数需要在输出流中增添头信息。然则头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的剧本是否已经发送了头信息。请参阅“输出控制函数”。

意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这谜底并不令人知足。由于往往程序在其他PHP环境下运行却正常。

首先:这错误是怎么发生的呢?让我们来看看PHP是若那边理HTTP header输出和主体输出的。

PHP剧本最先执行时,它可以同时发送header(题目)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立刻发送,相反,它被保留到一个列表中。 这样就可以允许你修改题目信息,包罗缺省的题目(例如 Content-Type 题目)。然则,一旦剧本发送了任何非题目的输出(例如,使用 HTML 或 print() 挪用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。尔后继续发送主体数据。从这时最先,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误新闻之一。

好!那我们来解决它:笨方式:把错误忠告全不显示! 掩耳盗铃之计 
error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可

 

dedecms Duplicate entry '10' for key 'PRIMARY是怎么回事?应该怎么解决

解决方案: 
1)适用于有权限编辑PHP。INI的人
打开php。ini文件(你应试比我清晰你的php。ini在那里),找到
output_buffering =改为on或者任何数字。若是是IIS6,请一定改为ON,否则你的PHP效率会奇慢。

 

2)使用虚拟主机,不能编辑PHP。INI,怎么办?

简朴:
在你的空间根目录下确立一个。htaccess文件,内容如下:

AllowOverride All
PHP_FLAG output_buffering On

不幸的情形是:照样不行?所有网页都不能显示啦?

那么,再用下面的方式:

在PHP文件的最最先加入:ini_set("output_buffering", "1");

让这个页面打开PHP的输出缓存。

3)在PHP文件里解决

ob_start()
启用output buffering机制。 Output buffering支持多条理 — 例如,可以多次挪用 ob_start() 函数。

ob_end_flush()
发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()
祛除output buffer但不发送,并禁用output buffering。

ob_get_contents()
将当前的output buffer返回成一个字符串。允许你处置剧本发出的任何输出。

原理:
output_buffering被启用时,在剧本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增添的缓存中(只能在PHP 4。0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,由于header现实上并没有发送。当所有剧本终止 时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。

 

4)绝杀技巧
     若是以上方式都不能等到知足的解决设施,请用如下设施:
     
     先用记事本打开泛起问题的网页,另存为ANSI编码的同名文件。
     再用EditPlus将该文件另存为UTF-8编码的文件。
     再试试,应该可以显示了。
造成的缘故原由主要由以下两点:
    一:在Header()函数之间输出了其他内容(一样平常由浏览器隐藏发送),导致了厥后的Header不能再次发送新的页面类型。这可以通过开启Output_Buffering来解决,方式2)与3)就是这样。
    二:PHP文件接纳UTF-8编码,由于编码不兼容(稀奇是通过其他编码转换过来的),发生了BOM《在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,以是不应该泛起在现实传输中。UCS规范建议我们在传输字节省前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样若是吸收者收到FEFF,就解释这个字节省是Big-Endian的;若是收到FFFE,就解释这个字节省是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。 
  UTF-8不需要BOM来解释字节顺序,但可以用BOM来解释编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。以是若是吸收者收到以EF BB BF开头的字节省,就知道这是UTF-8编码了。

  Windows就是使用BOM来符号文本文件的编码方式的。》导致了的头文件不能准确识别,这时只要去除UTF-8文件中的BOM就可以了,方式4)就是基于这种原理的。

出的。 PHP剧本最先执行时,它可以同时发送header(题目)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立刻发送,相反,它被保留到一个列表中。 这样就可以允许你修改题目信息,包罗缺省的题目(例如 Content-Type 题目)。然则,一旦剧本发送了任何非题目的输出(例如,使用 HTML 或 print() 挪用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。尔后继续发送主体数据。从这时最先,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误新闻之一。 好!那我们来解决它:笨方式:把错误忠告全不显示! 掩耳盗铃之计 error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可 解决方案: 1)适用于有权限编辑PHP。INI的人打开php。ini文件(你应试比我清晰你的php。ini在那里),找到 output_buffering =改为on或者任何数字。若是是IIS6,请一定改为ON,否则你的PHP效率会奇慢。 2)使用虚拟主机,不能编辑PHP。INI,怎么办? 简朴:在你的空间根目录下确立一个。htaccess文件,内容如下: AllowOverride All PHP_FLAG output_buffering On 不幸的情形是:照样不行?所有网页都不能显示啦? 那么,再用下面的方式: 在PHP文件的最最先加入:ini_set("output_buffering", "1"); 让这个页面打开PHP的输出缓存。 3)在PHP文件里解决 ob_start() 启用output buffering机制。 Output buffering支持多条理 — 例如,可以多次挪用 ob_start() 函数。 ob_end_flush() 发送output buffer(输出缓冲)并禁用output buffering机制。 ob_end_clean() 祛除output buffer但不发送,并禁用output buffering。 ob_get_contents() 将当前的output buffer返回成一个字符串。允许你处置剧本发出的任何输出。 原理: output_buffering被启用时,在剧本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增添的缓存中(只能在PHP 4。0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,由于header现实上并没有发送。当所有剧本终止 时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。 4)绝杀技巧 若是以上方式都不能等到知足的解决设施,请用如下设施: 先用记事本打开泛起问题的网页,另存为ANSI编码的同名文件。 再用EditPlus将该文件另存为UTF-8编码的文件。 再试试,应该可以显示了。 造成的缘故原由主要由以下两点: 一:在Header()函数之间输出了其他内容(一样平常由浏览器隐藏发送),导致了厥后的Header不能再次发送新的页面类型。这可以通过开启 Output_Buffering来解决,方式2)与3)就是这样。 二:PHP文件接纳UTF-8编码,由于编码不兼容(稀奇是通过其他编码转换过来的),发生了BOM《在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,以是不应该泛起在现实传输中。UCS规范建议我们在传输字节省前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样若是吸收者收到FEFF,就解释这个字节省是Big-Endian的;若是收到FFFE,就解释这个字节省是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。   UTF-8不需要BOM来解释字节顺序,但可以用BOM来解释编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。以是若是吸收者收到以EF BB BF开头的字节省,就知道这是UTF-8编码了。   Windows就是使用BOM来符号文本文件的编码方式的。》导致了的头文件不能准确识别,这时只要去除UTF-8文件中的BOM就可以了,方式4) 就是基于这种原理的。

关于织梦还算好用的几个调用

转载请说明出处内容投诉
八爷源码网 » PHP错误:Warning: Cannot modify header information - headers already sent by ...