Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2372388
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类:

2009-05-21 16:35:08

做了一个登录的页面
当用户登录成功时,用header跳转到首页
一直都是错,无法跳到你要的页面。
[color=Red]不过有一个奇怪的现象就是我在本地测试没问题,转到公网服务器上才有问题[/color]
一开始以为是session的问题,改用cookie。也是一样
服务器中报错日志是这样的
[client ] PHP Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/cccc/slogin.php:1) in /var/www/html/cccc/class/database.php on line 69, referer: 

上面database.php中的69行就是一个header的函数。

请大家帮忙来说说



  回复于:2007-05-24 18:36:37

我定义的HEADER函数是这样的
  function godir($url)
     {
       header("Location: "$url");
     }


  回复于:2007-05-24 20:34:52

你在header()之前已经有意或者无意的输出了文本或者空白, 仔细检查. 你在本机测试没问题, 而上传后有问题, 可能是你上传的时候ftp程序设置的问题, 请使用二进制方式上传.


  回复于:2007-05-24 20:40:49

还可能问题本身就存在,只不过本机php配置中的 error_reporting 没开 E_ALL ,把 E_WARNING 吃掉了


  回复于:2007-05-24 21:27:39

引用:原帖由 ideawu 于 2007-5-24 20:34 发表
你在header()之前已经有意或者无意的输出了文本或者空白, 仔细检查. 你在本机测试没问题, 而上传后有问题, 可能是你上传的时候ftp程序设置的问题, 请使用二进制方式上传. 



就是不明白,我哪个地方已经输出了空白或文本
我就是用一个表单提交,在处理页面做个判断,用户对得上就登录成功,马上就跳转。没成功就返回
会在哪个地方会输出呢


  回复于:2007-05-25 08:37:17

你可以使用curl -d "username=xxx&password=xxx" -D /tmp/a.txt 

然后看看a.txt 的内容


  回复于:2007-05-25 10:05:40

HTTP/1.1 200 OK
Date: Fri, 25 May 2007 01:55:08 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=GB2312


楼上的,这是按你的说法的结果,


  回复于:2007-05-25 10:15:15

你是单独一个文件还是已经包含在其他文件里。


  回复于:2007-05-25 10:22:36

是包含在主页里面的


  回复于:2007-05-25 10:48:27

引用:原帖由 lxc521 于 2007-5-25 10:22 发表
是包含在主页里面的 



那就看看你的header函数前有没有输出。


  回复于:2007-05-25 11:05:24

是不是有其他部分的错误提示在前面,比如数据库联接错误或者其他的。

可以做个测试,把出现错误的页面上的除了调用location的其他所有部分注释,然后一步一步向上解除注释,看看是增加哪一部分后就会出现错误


  回复于:2007-05-25 11:35:24

ob_start();
session_start();
require("common1.php ");
$name2=trim($_POST['username']);
$pwd=$_POST['password'];      
if($name2=='' || $pwd==''){
    Alert('用户名或密码不能为空');                       
exit;
}else{

$sql2="select userid,username,userpwd from member where username='$name2' and userpwd='$pwd'";
$result=$db->query($sql2);
$num=$db->getnum($result);
if($num>0){
  $rows=$db->gia($result); 
  $s_password=$rows['userpwd'];
  if($s_password==$pwd){

     $userid=$rows['userid'];
     $name2=$rows['username'];
    $_SESSION['userid']=$userid;
$_SESSION['username']=$name2;
  } 
    header('Location: /');

}else{
 Alert('密码错误');                      
exit;
  }
      $db->db_close();
}

 ?>

这个是我处理页面的代码

屏蔽掉其它代码,只留header,正常
测试输出$_SESSION['userid'],正常
一行一行测试正常,但当session和header一起使用时就会出错。
真是不明白,不知道还有没有其它方法代替这个没有,搞这个搞太久了


  回复于:2007-05-25 17:33:49

会不会是这个?
引用:
问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢? 
   答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那么问题就解决了。 
   注:此问题,会出PHP4.1.2中,更高版本,没有测试过。 




再不行换种跳转方式就是了。


  回复于:2007-05-25 17:58:41

肯定是在header之前已经有输出送给客户端了.

有个邪恶的想法, 用sniffer/tcpdump/看看到底传送了什么东西给客户端, 咔咔..~也许能看出什么苗头来


  回复于:2007-05-25 21:56:14

引用:原帖由 52linux 于 2007-5-25 08:37 发表
你可以使用curl -d "username=xxx&password=xxx" -D /tmp/a.txt 

然后看看a.txt 的内容 



还是用你这个方法找出了是真的有输出了
问题就是出在我用了那个require包含文件common1.php中定义的Alert函数为flase时返回用了echo.
可是有点奇怪就是这个Alert在用户和密码是正确时时都没有用到,怎么也会有输出呢


 hbl.ncut 回复于:2007-05-26 16:05:30

屏蔽掉其它代码,只留header,正常
测试输出$_SESSION['userid'],正常
一行一行测试正常,但当session和header一起使用时就会出错。

header() 前有输出...那和session有什么关系?


  回复于:2007-05-28 18:09:17

最近发生过一件最离奇的事情是, 我使用ultraedit编辑 php文件的时候, 大概是因为一不小心存成了UTF-8形式的文本

有兴趣你们可以试试, 
UE13.00->File->Save as->Format, 选择UTF-8, 此时该文件多出3个不可见字符EFBBBF在文件头部, 只能用UE的二进制编辑器才可以看出来, 用notepad, 或者ue的文本编辑是不可见的.


我们这个文件正好用来显示图片的, 比如...

php server永远都是先把那3个字符发送给客户端, 也就是
...
content-length: 3
EFBBBF

所以, 永远也显示不出图片, 调试了好几个小时才找到结果

[ 本帖最后由 cooljia 于 2007-5-28 18:11 编辑 ]








  回复于:2007-05-29 14:44:39

从别的地方找到的答案...
引用:。但是这里需要注意一点,即必须保证 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的缩写,指 UNICODE 文件头部用于指明高低字节排列顺序的几个字符,通常是 FFFE ,而将之用 UTF-8 编码之后,就是 EFBBBF 。由于 UTF-8 文件本身不存在字节序问题,所以对 UTF-16 等编码方式有重大意义的 BOM,对于 UTF-8 来说,只有一个作用——表明这个文件是 UTF-8 格式。由于 BOM 会给文本处理带来很多难题,所以现在很多软件都要求使用不带 BOM 的 UTF-8 文件,特别是一些处理文本的软件,如 PHP、 UNIX 脚本文件等,svn 也是如此。



  回复于:2007-05-29 22:37:47

通常我会这样处理的
function goto($uri) {

echo "";

}
阅读(1010) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-14 19:00:50

去掉前面的那个alert输出语句就可以了,header之前不能输出,我也是这个问题,去掉输出就解决了