出错历史:
我编写的代码从来没有顺利的执行过,可是由于本地环境和主机环境不一样,所以有的时候在本地测试合格放到主机上则不行,而有的时候则相反..
这次是一段函数出错了,错误提示:
Warning : Cannot modify header information - headers already sent by (output started at xxx.php:32) in xxx.php on line 34
xxx.php,把文件开头的空格全都去掉,如果是 UTF-8 格式保证文件头部没有 BOM。
如果不是这个原因,就要检查你的代码,在调用 header 命令之前,不要有任何输出。
我开始在所有的php页头查找bom,无果..后来用UltraEdit32(默认我是用Notepad++)从新全部保存了一遍无BOM格式.上传后问题依旧.没有办法,我建立了一个”del_bom.php”,代码如下:
下载: del_bom.php
<?php
$basedir = "."; //修改此行為需要檢測的目錄,點表示當前目錄
$auto = 1; //是否自動移除發現的BOM信息。1為是,0為否。
//以下不用改动
if ($dh = opendir($basedir))
{
while (($file = readdir($dh)) !== false)
{
if ($file != '.' && $file != '..' && !is_dir($basedir . "/" . $file))
echo "filename: $file " . checkbom("$basedir/$file") . "<br>";
}
closedir($dh);
}
function checkbom ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191)
{
if ($auto == 1)
{
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("BOM found, automatically removed.");
}
else
{
return ("BOM found.");
}
}
else return ("BOM Not Found.");
}
function rewrite ($filename, $data)
{
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
$basedir = "."; //修改此行為需要檢測的目錄,點表示當前目錄
$auto = 1; //是否自動移除發現的BOM信息。1為是,0為否。
//以下不用改动
if ($dh = opendir($basedir))
{
while (($file = readdir($dh)) !== false)
{
if ($file != '.' && $file != '..' && !is_dir($basedir . "/" . $file))
echo "filename: $file " . checkbom("$basedir/$file") . "<br>";
}
closedir($dh);
}
function checkbom ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191)
{
if ($auto == 1)
{
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("BOM found, automatically removed.");
}
else
{
return ("BOM found.");
}
}
else return ("BOM Not Found.");
}
function rewrite ($filename, $data)
{
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
运行后还是不行,我想应该不是BOM的问题..我仔细看了一遍提示出错的XXX.php…发现提示的错误行代码我是这样写的:
下载: XXX.php
//执行SQL语句
if(mysql_query($sql))
{
echo 'var recorded = true; alert($ip);';
//设定Cookie值,设置1天后失效
setcookie("visited", true, time()+3600*24);
}
else //插入失败
{
echo 'var recorded = false; alert($ip);';
//设定Cookie值,失效时间为过去,即删除该Cookie
setcookie("visited", false, time()-3600*24);
}
if(mysql_query($sql))
{
echo 'var recorded = true; alert($ip);';
//设定Cookie值,设置1天后失效
setcookie("visited", true, time()+3600*24);
}
else //插入失败
{
echo 'var recorded = false; alert($ip);';
//设定Cookie值,失效时间为过去,即删除该Cookie
setcookie("visited", false, time()-3600*24);
}
花儿给我的提示是:在调用 header 命令之前,不要有任何输出
我想起PHP中stecookie前世不能echo的..但是无法,这段代码是必须的,我在CSDN上询问,专家给出解决办法,修改如下:
下载: xxx.php
//执行SQL语句
if(mysql_query($sql))
{
//设定Cookie值,设置1天后失效
setcookie("visited", true, time()+3600*24);
echo 'var recorded = true; alert($ip);';
}
else //插入失败
{
//设定Cookie值,失效时间为过去,即删除该Cookie
setcookie("visited", false, time()-3600*24);
echo 'var recorded = false; alert($ip);';
}
if(mysql_query($sql))
{
//设定Cookie值,设置1天后失效
setcookie("visited", true, time()+3600*24);
echo 'var recorded = true; alert($ip);';
}
else //插入失败
{
//设定Cookie值,失效时间为过去,即删除该Cookie
setcookie("visited", false, time()-3600*24);
echo 'var recorded = false; alert($ip);';
}
这段代码我之前也测试过,不行,错误提示:找不到$ip
无奈,我又询问了花儿解决办法.答复如下:
用 ob_start() ob_flush() 这套函数吧
正当我修改代码后要上传的时候,发现错误提示不见了.并且数据库中出现了点变化.
以前我用同一页面强制刷新后数据库中会增加一条记录,而现在不会了.我再用其他浏览器登录,数据库中又会增加一条数据.
那就是说说cookie的设置生效了.
到这里事件结束,可是我有点摸不着头脑为何..代码依然还是以前的代码…
等我查阅相关资料后补充这篇post.
在此感谢花儿
PS:后来又断断续续出现此问题,没有办法,加上了ob_start(); 代码..问题不在出现了…