2011-04-13 41 views
1

我在网站上实现了一个联系表单,它利用php和phpmailer类通过我的主机smtp服务器发送邮件。疑难解答“无法发送会话缓存限制器 - 头文件已发送”

当我提交我收到以下错误消息的形式:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent

这里是我使用的代码完整的网页...

<?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&\'\.\-_\+][email protected][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是很好的。我通过表单发送消息,然后在收件箱中收到消息。

+2

集管被发送。任何时候调用'echo'都会发送输出,或者任何时候文本出现在''标签之外的php文件中。请注意''之前的任何空格。确保在调用session_start之前没有任何输出 – 2011-04-13 21:02:11

+0

您在使用任何形式的输出到浏览器之后使用session_start()。 – Khez 2011-04-13 21:02:56

+0

让我们看看一些代码 – 2011-04-13 21:03:12

回答

0

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

+0

谢谢judda - 这个伎俩。 :)只有当我读到你的最后一个单词',而不是'我最终是否与ob_start协商并取代session_start。现在一切都很好:)谢谢。 – Alan 2011-04-14 04:44:16

2

“Headers already sent”意味着在调用session_start()之前完成了一些输出,这是一个修改头的函数。通常这是因为第一个php-tag前面的一些空间被视为输出。 session_start被调用之前可以输出到浏览器 - 甚至没有一个空间 -

<?php 

?> 
[[NEW LINE!]] 

没有:

+0

感谢您的回复:)我已经尝试删除任何白色空间可能在那里,但它没有帮助。 – Alan 2011-04-13 21:26:08

0

这通常可以由在年底新线,像include()编辑文件引起的。

0

有三件事情来检查:

  1. 正如其他人所建议的,在该文件的开头或结尾空白双重检查。
  2. 如果您的表单处理器已通过其他脚本包含包含,请检查包含它的脚本以确保该表单上没有空格。
  3. 最后,删除一个十六进制编辑器,并检查文件开头处的字节顺序标记

最后一个需要更多解释。

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

由于BOM是供程序使用,而不是由人直接使用,因此大多数文本编辑器都会默默地压制它。例如,SciTE程序习惯于向UTF-8编码的文本文件添加BOM,然后不显示它。但它仍然存在,它会在您的文件中的任何其他位置发送。

而这会使您的标题发出警告。因此,加载一个十六进制编辑器。如果你在Windows上开发,你可以试试XVI32。在Linux上,尝试删除(命令行),ghex(gnome)或hexedit(通用X-Windows)。十六进制编辑器会显示确切的文件,包括可能存在的任何BOM。

+0

感谢会 - 用ob_start替换session_start虽然做了诀窍。我使用记事本++来编写我的代码,它有一些非常漂亮的功能用于切换空白。无论我做了什么,错误都会持续到我用ob取代session。直到最近我才在session_start之前添加ob_start。只要我删除session_start一起...瞧!那是怎么回事?如果这不是一个空白问题,它不是一个编码(BOM)问题,那究竟是什么?有人知道吗? – Alan 2011-04-14 04:42:57

+0

在顶栏中有一个名为'Encoding'的漂亮的小菜单。确保你的设置正确。 – 2015-05-10 18:10:13

0

我有同样的问题。我说这些线在顶部和它的工作

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

一般来说,当我们回显或打印后发头这个错误出现。如果此错误出现在特定页面上,请确保该页面在调用start_session()之前不回显任何内容。不可预知的误差

实施例:当发送输出

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

//your page content 
相关问题