0

setcookie前echo

Posted in code at February 26th, 2008 /

出错历史:
我编写的代码从来没有顺利的执行过,可是由于本地环境和主机环境不一样,所以有的时候在本地测试合格放到主机上则不行,而有的时候则相反..
这次是一段函数出错了,错误提示:

Warning :  Cannot  modify  header  information  -  headers  already  sent  by  (output   started   at   xxx.php:32)  in  xxx.php on  line 34

我询问了花儿zhiqiang,前者给我的答复如下:

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);
}
?>

运行后还是不行,我想应该不是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);
    
}

花儿给我的提示是:在调用 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);';
    
}

这段代码我之前也测试过,不行,错误提示:找不到$ip
无奈,我又询问了花儿解决办法.答复如下:

用 ob_start() ob_flush() 这套函数吧

正当我修改代码后要上传的时候,发现错误提示不见了.并且数据库中出现了点变化.
以前我用同一页面强制刷新后数据库中会增加一条记录,而现在不会了.我再用其他浏览器登录,数据库中又会增加一条数据.
那就是说说cookie的设置生效了.
到这里事件结束,可是我有点摸不着头脑为何..代码依然还是以前的代码…
等我查阅相关资料后补充这篇post.

在此感谢花儿

PS:后来又断断续续出现此问题,没有办法,加上了ob_start(); 代码..问题不在出现了…

Published in code
Tags: , ,

No Responses to “setcookie前echo”

Leave a Reply