Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “故障排除”;无法发送会话缓存限制器-标头已发送“;_Php_Forms - Fatal编程技术网

Php “故障排除”;无法发送会话缓存限制器-标头已发送“;

Php “故障排除”;无法发送会话缓存限制器-标头已发送“;,php,forms,Php,Forms,我在一个网站上实现了一个联系人表单,它利用php和phpMail类通过我的主机smtp服务器发送邮件 提交表单时,我收到以下错误消息: 警告:会话启动()[function.session start]:无法发送会话缓存限制器-已发送头 这是我正在使用的代码的完整页面 <?php session_start(); $name = trim($_POST['name']); $email = $_POST['email']; $comments = $_POST['

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

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

警告:会话启动()[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
?>

“Headers ready sent”表示您在调用session_start()之前已经完成了一些输出,session_start()是一个修改header的函数。这通常是因为第一个php标记前面有一些空格,可以算作输出。

这通常是由于
include()
ed文件末尾有新行造成的,例如:

<?php

?>
[[NEW LINE!]]

[[新品!]]

没有什么-即使在代码< SistSuxStuts被调用之前也没有空间可以输出到浏览器。

< P>如果你不想在脚本的开头设置SeStOxSistActer(),考虑打开输出缓冲(OBSCAST())。

< P>有三个要检查的东西:

  • 正如其他人所建议的,再次检查文件开头或结尾的空白
  • 如果您的表单处理器已被另一个脚本包含,请检查包含它的脚本,以确保该脚本上没有空白
  • 最后,弹出一个十六进制编辑器,检查文件开头是否有字节顺序标记
  • 最后一个需要更多的解释

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

    由于BOM表是供程序使用的,而不是供人直接使用,因此大多数文本编辑器都会自动将其隐藏。例如,程序SciTE有一个习惯,即向UTF-8编码的文本文件添加BOM表,然后不显示它。但它仍然在那里,而且它在你的文件中被发送之前


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

    我也遇到了同样的问题。我在顶部添加了这些行,效果很好

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

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

    不可预测错误的示例:

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

    发送输出时发送标题。无论何时调用
    echo
    ,或php文件中出现
    标记之外的文本,都会发送输出。请注意
    之前的空格。请确保在调用
    session\u start
    之前没有任何输出您在任何形式的输出到浏览器之后使用session\u start()。我以前遇到过此问题,请参阅我的answer@Joe这是我正在使用的代码……”哦,谢谢大家的快速回复:)谢谢你们的回复:)我已经尝试删除其中可能存在的任何空白,但没有任何帮助。谢谢威尔-用ob\u start替换session\u start成功了。我使用记事本++编写代码,它有一些非常漂亮的消除空白的功能。无论我做了什么,这个错误一直持续到我用ob替换会话。直到最近,我一直在会话开始之前添加ob_start。一旦我删除了会话,你就可以开始了。。。瞧!怎么回事?如果这不是一个空白问题,也不是一个编码(BOM)问题,那么它到底是什么?有人知道吗?在顶部的栏中有一个非常小的菜单,名为
    编码
    。确保您已正确设置。谢谢judda-这成功了。:)只有在我读了你最后一句话“取而代之”之后,我才最终继续并用ob_start替换session_start。现在一切都好了:)谢谢。