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