Добрый день, товарищи программисты! Вопрос у меня следующий: Есть код отправки письма..... Код (Text): $to = 'test@test.ru'; $headers = 'From: webmaster@site.ru' . "\r\n"; $headers .= 'Bcc: test2@testl.ru' . "\r\n"; $mess = 'Текст письма'; $send = mail($to, 'Письмо с сайта', $mess, $headers); if ($send) { header ("Location:/"); exit; } Понятно, что заголовки у меня уже отправлены, но как я могу обновить страницу и очистить данные формы? После отправки сообщения мне выдаётся ошибка Warning: Cannot modify header information - headers already sent by и указывается на строку с header ().
точно на эту строку? обычно сообщается где они были УЖЕ отправлены и потом указывается откуда была попытка повторной отправки - в данном случае как раз может быть ваш хидер-локейшн. а вот кто отправил заголовки? кто начал поток? полный текст ошибки покажите?
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\luxeheat\index.php:8) in Z:\home\localhost\www\luxeheat\index.php on line 160 Указывает на строку header ("Location:/");
Там я скрипт проверки формы подключаю: Код (Text): <script language="javascript" src="scripts/checkform.js"></script > Сам скрипт: Код (Text): function checkForm(form) { // Заранее объявим необходимые переменные var el, // Сам элемент elName, // Имя элемента формы value, // Значение type; // Атрибут type для input-ов // Массив списка ошибок, по дефолту пустой var errorList = []; // Хэш с текстом ошибок (ключ - ID ошибки) var errorText = { 1 : "Не заполнено поле 'Имя'", 2 : "Не заполнено поле 'Должность'", 3 : "Не заполнено поле 'Организация'", 4 : "Не указан город", 5 : "Не указан телефон", 6 : "Не заполнено поле 'E-mail'", 7 : "Не верно заполнено поле 'E-mail'" } var pattern=/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/; // Получаем семейство всех элементов формы // Проходимся по ним в цикле for (var i = 0; i < form.elements.length; i++) { el = form.elements[i]; elName = el.nodeName.toLowerCase(); value = el.value; if (elName == "input") { // INPUT // Определяем тип input-а type = el.type.toLowerCase(); // Разбираем все инпуты по типам и обрабатываем содержимое switch (type) { case "text" : if (el.name == "name" && value == "") errorList.push(1); if (el.name == "position" && value == "") errorList.push(2); if (el.name == "org" && value == "") errorList.push(3); if (el.name == "sity" && value == "") errorList.push(4); if (el.name == "phone" && value == "") errorList.push(5); if (el.name == "email" && value == "") errorList.push(6); if (el.name == "email" && value !== "") { if(pattern.test(form.email.value)) { } else { errorList.push(7); } } break; default : // Сюда попадают input-ы, которые не требуют обработки // type = hidden, submit, button, image break; } } } // Финальная стадия // Если массив ошибок пуст - возвращаем true if (!errorList.length) return true; // Если есть ошибки - формируем сообщение, выовдим alert // и возвращаем false var errorMsg = "При заполнении формы допущены следующие ошибки:\n\n"; for (i = 0; i < errorList.length; i++) { errorMsg += errorText[errorList[i]] + "\n"; } alert(errorMsg); return false; }
вот и ответ. это вывод в поток. любой вывод в поток первым делом выбрасывает собранные заголовки ответа. попытка повторной отправки заголовков приводит к ошибке, которую вы наблюдаете. переписывайте PHP сценарий. тема заголовков достаточно часто обсуждается. и очень часто причиной отправки потока и заголовков становится метка BOM (byte order mark) при использовании мультибайтных кодировок - тогда вы увидите строку 1 в инициаторе отправки. а если вы видите строку номер 0, то скорее всего это произошло в процессе выполнения файла, указанного директивой auto_prepend. удачи.