我在网站上实现了一个联系表单,它利用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在大多数情况下都很好。我通过表单发送消息,然后在收件箱中收到。
答案 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)
有三件事需要检查:
最后一个需要更多解释。
文本编辑器有时会向使用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