疑难解答“无法发送会话缓存限制器 - 已发送的标头”

时间:2011-04-13 20:52:29

标签: php forms

我在网站上实现了一个联系表单,它利用php和phpmailer类通过我的主机smtp服务器发送邮件。

当我提交表单时,我收到以下错误消息:

  

警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已发送的标头

这是我正在使用的完整代码页......

<?php
session_start();

    $name = trim($_POST['name']);
    $email = $_POST['email'];
    $comments = $_POST['comments'];
    $captcha = $_POST['captcha'];

    $site_owners_email = 'myemail.com'; 
    $site_owners_name = 'my name'; 

    if (strlen($name) < 2) {
        $error['name'] = "Please enter your name";  
    }

    if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
        $error['email'] = "Please enter a valid email address"; 
    }

    if (strlen($comments) < 3) {
        $error['comments'] = "Please leave a comment";
    }

    if (int($captcha) !== ($_SESSION['randomnr2'])) { 
        $error['captcha'] = "CAPTCHA error. Please try again";
    }

    if (!$error) {

        require_once('phpMailer/class.phpmailer.php');
        $mail = new PHPMailer();

        $mail->From = $email;
        $mail->FromName = $name;
        $mail->Subject = "Contact Form";
        $mail->AddAddress($site_owners_email, $site_owners_name);
        $mail->Body = $comments;

        // Mail Server Settings

        $mail->Mailer = "smtp";
        $mail->Host = "myhost.com";
        $mail->Port = "25"; 
        $mail->SMTPSecure = "tls"; 
        $mail->SMTPAuth = true; 
        $mail->Username = "myname.com"; 
        $mail->Password = "mypassword"; 

        $mail->Send();

        echo "<li class='success'> Thank you " . $name . ". We've received your email. We'll be in touch with you as soon as we possibly can! </li>";

    } # end if no error
    else {

        $response = (isset($error['name'])) ? "<li>" . $error['name'] . "</li> \n" : null;
        $response .= (isset($error['email'])) ? "<li>" . $error['email'] . "</li> \n" : null;
        $response .= (isset($error['comments'])) ? "<li>" . $error['comments'] . "</li>" : null;
        $response .= (isset($error['captcha'])) ? "<li>" . $error['captcha'] . "</li>" : null;

        echo $response;
    } # end if there was an error sending
?>

表单 正在运行,所以php在大多数情况下都很好。我通过表单发送消息,然后在收件箱中收到。

6 个答案:

答案 0 :(得分:2)

&#34;已发送标题&#34;表示在调用session_start()之前已经完成了一些输出,这是一个修改标题的函数。通常这是因为第一个php-tag前面的空格被视为输出。

答案 1 :(得分:0)

这通常可能是由于include() ed文件在最后有一个新行引起的,例如:

<?php

?>
[[NEW LINE!]]

在调用session_start之前,没有任何东西 - 甚至不是空格 - 都可以输出到浏览器。

答案 2 :(得分:0)

如果您不想将session_start()放在脚本的开头,请考虑改为启用输出缓冲(ob_start())。

答案 3 :(得分:0)

有三件事需要检查:

  1. 正如其他人所建议的那样,请在文件的开头或结尾仔细检查空格
  2. 如果您的表单处理器被其他脚本包含,请检查包含它的脚本,以确保该脚本上没有空格。
  3. 最后,破坏了十六进制编辑器并检查文件开头的字节顺序标记
  4. 最后一个需要更多解释。

    文本编辑器有时会向使用Unicode编码的文件添加Byte Order Mark(BOM)。例如,UTF-8 BOM是,并显示为文件中的前三个字符。它的目的是告诉程序读取多字节字符的顺序。在UTF-8中,它实际上很少需要,因为大多数UTF-8字符代码只有一个字节长。

    由于BOM旨在供程序使用,而不是由人类直接使用,因此大多数文本编辑器都会默默地禁止它。例如,SciTE程序习惯于将BOM添加到UTF-8编码的文本文件中,然后不显示它。但它仍然存在,它会在你文件中的任何其他内容之前发送。

    这将使你的HEADERS SENT警告绊倒。所以,加载一个十六进制编辑器。如果您在Windows上进行开发,则可以尝试XVI32。在Linux上,尝试使用shed(命令行),ghex(gnome)或hexedit(通用X-Windows)。十六进制编辑器将显示确切的文件,包括可能存在的任何BOM。

答案 4 :(得分:0)

我遇到了同样的问题。我在顶部添加了这些行并且它可以工作

if($_REQUEST['callback']){
    header('Content-Type: application/javascript');
}else{
    header('Content-Type: application/json');
}

答案 5 :(得分:0)

通常在回显或打印后发送标题时会出现此错误。如果在特定页面上出现此错误,请确保在调用start_session()之前页面没有回显任何内容。

不可预测的错误示例:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content