Устранение неполадок «Не удается отправить ограничитель кэша сеанса - заголовки уже отправлены» - PullRequest
1 голос
/ 14 апреля 2011

Я реализовал контактную форму на веб-сайте, и она использует php и класс phpmailer для отправки писем через SMTP-серверы hosts.

Когда я отправляю форму, я получаю следующее сообщение об ошибке:

Предупреждение: 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 ]

2 голосов
/ 14 апреля 2011

«Заголовки уже отправлены» означает, что вы сделали некоторые выходные данные до того, как вызвали session_start (), которая является функцией, которая изменяет заголовок. Зачастую это связано с тем, что перед первым php-тегом есть место, которое считается выходным.

0 голосов
/ 03 февраля 2015

Обычно эта ошибка возникает, когда мы отправляем заголовок после отображения или печати.Если эта ошибка возникает на определенной странице, убедитесь, что страница ничего не отображает, прежде чем вызывать start_session ().

Пример непредсказуемой ошибки:

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

//your page content
0 голосов
/ 12 сентября 2013

У меня была такая же проблема.Я добавил эти строки вверху, и это сработало

if($_REQUEST['callback']){
    header('Content-Type: application/javascript');
}else{
    header('Content-Type: application/json');
}
0 голосов
/ 14 апреля 2011

Есть три вещи, которые нужно проверить:

  1. Как и другие предлагали, дважды проверьте пробел в начале или конце файла.
  2. Если ваш обработчик форм был включен другим сценарием, проверьте сценарий, в который он был включен, чтобы убедиться, что на нем нет пробелов.
  3. Наконец, откройте шестнадцатеричный редактор ипроверьте Порядок следования байтов в начале файла.

Последний требует дополнительного пояснения.

Текстовые редакторы иногда добавляют Порядок следования байтов (BOM) для файлов, закодированных с использованием Unicode.Например, спецификация UTF-8 - это »» и отображается как первые три символа в файле.Его цель - сообщить программам, в каком порядке следует читать многобайтовые символы. В UTF-8 это редко требуется, поскольку большинство кодов символов UTF-8 имеют длину только один байт.

Поскольку спецификация предназначена дляиспользование программами, а не непосредственно людьми, большинство текстовых редакторов будут молча подавлять его.Например, программа SciTE имеет привычку добавлять спецификацию в текстовые файлы в кодировке UTF-8, а затем не показывать ее.Но он все еще там, и он отправляется, прежде чем что-либо еще в вашем файле.

И это отключит предупреждение отправлено заголовками.Итак, загрузите шестнадцатеричный редактор.Если вы разрабатываете для Windows, вы можете попробовать XVI32 .В Linux попробуйте shed (командная строка), ghex (gnome) или hexedit (универсальный X-Windows).Шестнадцатеричный редактор покажет вам точный файл, включая любую возможную спецификацию.

0 голосов
/ 14 апреля 2011

Если вы не хотите помещать session_start () в начале скрипта, рассмотрите возможность включения буферизации вывода (ob_start ()).

0 голосов
/ 14 апреля 2011

Это часто может быть вызвано тем, что include() ed файлы имеют новую строку в конце, например:

<?php

?>
[[NEW LINE!]]

Ничто - даже пробел - не может быть выведено в браузер до session_startназывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...