登录的时候报错
Warning: Cannot modify header information - headers already sent by (output started at D:\wamp\www\bbb\login.php:2) in D:\wamp\www\bbb\includes\login.func.php on line 36Warning: Cannot modify header information - headers already sent by (output started at D:\wamp\www\bbb\login.php:2) in D:\wamp\www\bbb\includes\login.func.php on line 37Warning: Cannot modify header information - headers already sent by (output started at D:\wamp\www\bbb\login.php:2) in D:\wamp\www\bbb\includes\global.func.php on line 40

global.func.php代码如下:
<?php
/**
* TestGuest Version1.0
* ================================================
* Copy 2010-2012 yc60
* Web: http://www.yc60.com
* ================================================
* Author: Lee
* Date: 2010-8-11
*//**
 *_runtime()是用来获取执行耗时
 * @access public  表示函数对外公开
 * @return float 表示返回出来的是一个浮点型数字
 */
function _runtime() {
$_mtime = explode(' ',microtime());
return $_mtime[1] + $_mtime[0];
}/**
 * _alert_back()表是JS弹窗
 * @access public
 * @param $_info
 * @return void 弹窗
 */
function _alert_back($_info) {
echo "<script type='text/javascript'>alert('$_info');history.back();</script>";
exit();
}function _location($_info,$_url) {
if (!empty($_info)) {
echo "<script type='text/javascript'>alert('$_info');location.href='$_url';</script>";
exit();
} else {
header('Location:'.$_url);
}
}/**
 * _login_state登录状态的判断
 */function _login_state() {
if (isset($_COOKIE['username'])) {
_alert_back('登录状态无法进行本操作!');
}
}
/**
 * _session_destroy删除session
 */function _session_destroy() {
session_destroy();
}/**
 * 删除cookies   _unsetcookies()
 */function _unsetcookies() {
setcookie('username','',time()-1);
setcookie('uniqid','',time()-1);
_session_destroy();
_location(null,'index.php');
}
/**
 * 
 */function _sha1_uniqid() {
return _mysql_string(sha1(uniqid(rand(),true)));
}/**
 * _mysql_string
 * @param string $_string
 * @return string $_string
 */function _mysql_string($_string) {
//get_magic_quotes_gpc()如果开启状态,那么就不需要转义
if (!GPC) {
return mysql_real_escape_string($_string);

return $_string;
}
/**
 * _check_code
 * @param string $_first_code
 * @param string $_end_code
 * @return void 验证码比对
 */function _check_code($_first_code,$_end_code) {
if ($_first_code != $_end_code) {
_alert_back('验证码不正确!');
}
}/**
 * _code()是验证码函数
 * @access public 
 * @param int $_width 表示验证码的长度
 * @param int $_height 表示验证码的高度
 * @param int $_rnd_code 表示验证码的位数
 * @param bool $_flag 表示验证码是否需要边框 
 * @return void 这个函数执行后产生一个验证码
 */
function _code($_width = 75,$_height = 25,$_rnd_code = 4,$_flag = false) {

//创建随机码
for ($i=0;$i<$_rnd_code;$i++) {
$_nmsg .= dechex(mt_rand(0,15));
}

//保存在session
$_SESSION['code'] = $_nmsg;

//创建一张图像
$_img = imagecreatetruecolor($_width,$_height);

//白色
$_white = imagecolorallocate($_img,255,255,255);

//填充
imagefill($_img,0,0,$_white);

if ($_flag) {
//黑色,边框
$_black = imagecolorallocate($_img,0,0,0);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
}

//随即画出6个线条
for ($i=0;$i<6;$i++) {
$_rnd_color = imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
imageline($_img,mt_rand(0,$_width),mt_rand(0,$_height),mt_rand(0,$_width),mt_rand(0,$_height),$_rnd_color);
}

//随即雪花
for ($i=0;$i<100;$i++) {
$_rnd_color = imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),'*',$_rnd_color);
}

//输出验证码
for ($i=0;$i<strlen($_SESSION['code']);$i++) {
$_rnd_color = imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));
imagestring($_img,5,$i*$_width/$_rnd_code+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$_rnd_color);
}

//输出图像
header('Content-Type: image/png');
imagepng($_img);

//销毁
imagedestroy($_img);
}
?>

解决方案 »

  1.   

    output started at D:\wamp\www\bbb\login.php:2
    是说在 D:\wamp\www\bbb\login.php 第2行发现有输出
      

  2.   


    这是login.php的代码:<?php
    /**
    * TestGuest Version1.0
    * ================================================
    * Copy 2010-2012 yc60
    * Web: http://www.yc60.com
    * ================================================
    * Author: Lee
    * Date: 2010-8-21
    */
    session_start();
    //定义个常量,用来授权调用includes里面的文件
    define('IN_TG',true);
    //定义个常量,用来指定本页的内容
    define('SCRIPT','login');
    //引入公共文件
    require dirname(__FILE__).'/includes/common.inc.php';
    //登录状态
    _login_state();
    //开始处理登录状态
    if ($_GET['action'] == 'login') {
    //为了防止恶意注册,跨站攻击
    _check_code($_POST['code'],$_SESSION['code']);
    //引入验证文件
    include ROOT_PATH.'includes/login.func.php';
    //接受数据
    $_clean = array();
    $_clean['username'] = _check_username($_POST['username'],2,20);
    $_clean['password'] = _check_password($_POST['password'],6);
    $_clean['time'] = _check_time($_POST['time']);
    //到数据库去验证
    if (!!$_rows = _fetch_array("SELECT tg_username,tg_uniqid FROM tg_user WHERE tg_username='{$_clean['username']}' AND tg_password='{$_clean['password']}' AND tg_active='' LIMIT 1")) {
    _close();
    _session_destroy();
    _setcookies($_rows['tg_username'],$_rows['tg_uniqid'],$_clean['time']);
    _location(null,'index.php');
    } else {
    _close();
    _session_destroy();
    _location('用户名密码不正确或者该账户未被激活!','login.php');
    }
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>多用户留言系统--登录</title>
    <?php 
    require ROOT_PATH.'includes/title.inc.php';
    ?>
    <script type="text/javascript" src="js/code.js"></script>
    <script type="text/javascript" src="js/login.js"></script>
    </head>
    <body>
    <?php 
    require ROOT_PATH.'includes/header.inc.php';
    ?><div id="login">
    <h2>登录</h2>
    <form method="post" name="login" action="login.php?action=login">
    <dl>
    <dt></dt>
    <dd>用 户 名:<input type="text" name="username" class="text" /></dd>
    <dd>密  码:<input type="password" name="password" class="text" /></dd>
    <dd>保  留:<input type="radio" name="time" value="0" checked="checked" /> 不保留 <input type="radio" name="time" value="1" /> 一天 <input type="radio" name="time" value="2" /> 一周 <input type="radio" name="time" value="3" /> 一月</dd>
    <dd>验 证 码:<input type="text" name="code" class="text code"  /> <img src="code.php" id="code" /></dd>
    <dd><input type="submit" value="登录" class="button" /> <input type="button" value="注册" id="location" class="button location" /></dd>
    </dl>
    </form>
    </div><?php 
    require ROOT_PATH.'includes/footer.inc.php';
    ?>
    </body>
    </html>
      

  3.   

    你先看看 login.php 第 2 行是什么?是否有 BOM 头
      

  4.   

    用编辑器打开,另存,保存时选择无bom utf-8,有些编辑器是无签名utf-8,意思一样
      

  5.   

    搞定啦  我php.ini的output_buffering是off  改成on就行了