За последние 24 часа нас посетили 17566 программистов и 1310 роботов. Сейчас ищет 1101 программист ...

Переадресация после отправки письма

Тема в разделе "Работа с почтой", создана пользователем Фибер Оптик, 16 май 2013.

  1. Фибер Оптик

    Фибер Оптик Новичок

    С нами с:
    16 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Добрый день, товарищи программисты!

    Вопрос у меня следующий:
    Есть код отправки письма.....

    Код (Text):
    1. $to = 'test@test.ru';
    2. $headers = 'From: webmaster@site.ru' . "\r\n";
    3. $headers .= 'Bcc: test2@testl.ru' . "\r\n";
    4. $mess = 'Текст письма';
    5.  
    6.  $send = mail($to, 'Письмо с сайта', $mess, $headers);
    7.  if ($send) {
    8.  header ("Location:/");
    9.  exit;
    10.  }
    Понятно, что заголовки у меня уже отправлены, но как я могу обновить страницу и очистить данные формы?
    После отправки сообщения мне выдаётся ошибка Warning: Cannot modify header information - headers already sent by и указывается на строку с header ().
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    точно на эту строку? обычно сообщается где они были УЖЕ отправлены и потом указывается откуда была попытка повторной отправки - в данном случае как раз может быть ваш хидер-локейшн. а вот кто отправил заголовки? кто начал поток? полный текст ошибки покажите?
     
  3. Фибер Оптик

    Фибер Оптик Новичок

    С нами с:
    16 май 2013
    Сообщения:
    4
    Симпатии:
    0
    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:/");
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    160 указывает на строку с хидер-локейшн. а что в строке 8 ?
     
  5. Фибер Оптик

    Фибер Оптик Новичок

    С нами с:
    16 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Там я скрипт проверки формы подключаю:
    Код (Text):
    1. <script language="javascript" src="scripts/checkform.js"></script >
    Сам скрипт:
    Код (Text):
    1. function checkForm(form) {
    2. // Заранее объявим необходимые переменные
    3. var el, // Сам элемент
    4. elName, // Имя элемента формы
    5. value, // Значение
    6. type; // Атрибут type для input-ов
    7. // Массив списка ошибок, по дефолту пустой
    8. var errorList = [];
    9. // Хэш с текстом ошибок (ключ - ID ошибки)
    10. var errorText = {
    11. 1 : "Не заполнено поле 'Имя'",
    12. 2 : "Не заполнено поле 'Должность'",
    13. 3 : "Не заполнено поле 'Организация'",
    14. 4 : "Не указан город",
    15. 5 : "Не указан телефон",
    16. 6 : "Не заполнено поле 'E-mail'",
    17. 7 : "Не верно заполнено поле 'E-mail'"
    18. }
    19. var pattern=/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
    20. // Получаем семейство всех элементов формы
    21. // Проходимся по ним в цикле
    22. for (var i = 0; i < form.elements.length; i++) {
    23. el = form.elements[i];
    24. elName = el.nodeName.toLowerCase();
    25. value = el.value;
    26. if (elName == "input") { // INPUT
    27. // Определяем тип input-а
    28. type = el.type.toLowerCase();
    29. // Разбираем все инпуты по типам и обрабатываем содержимое
    30. switch (type) {
    31. case "text" :
    32. if (el.name == "name" && value == "") errorList.push(1);
    33. if (el.name == "position" && value == "") errorList.push(2);
    34. if (el.name == "org" && value == "") errorList.push(3);
    35. if (el.name == "sity" && value == "") errorList.push(4);
    36. if (el.name == "phone" && value == "") errorList.push(5);
    37. if (el.name == "email" && value == "") errorList.push(6);
    38. if (el.name == "email" && value !== "")
    39. {
    40. if(pattern.test(form.email.value))
    41.     {  
    42.  
    43.     }
    44.     else
    45.     {  
    46. errorList.push(7);
    47.     }  
    48.     }
    49. break;
    50. default :
    51. // Сюда попадают input-ы, которые не требуют обработки
    52. // type = hidden, submit, button, image
    53. break;
    54. }
    55. }
    56. }
    57. // Финальная стадия
    58. // Если массив ошибок пуст - возвращаем true
    59. if (!errorList.length) return true;
    60. // Если есть ошибки - формируем сообщение, выовдим alert
    61. // и возвращаем false
    62. var errorMsg = "При заполнении формы допущены следующие ошибки:\n\n";
    63. for (i = 0; i < errorList.length; i++) {
    64. errorMsg += errorText[errorList[i]] + "\n";
    65. }
    66. alert(errorMsg);
    67. return false;
    68. }
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот и ответ. это вывод в поток. любой вывод в поток первым делом выбрасывает собранные заголовки ответа. попытка повторной отправки заголовков приводит к ошибке, которую вы наблюдаете. переписывайте PHP сценарий.

    тема заголовков достаточно часто обсуждается. и очень часто причиной отправки потока и заголовков становится метка BOM (byte order mark) при использовании мультибайтных кодировок - тогда вы увидите строку 1 в инициаторе отправки. а если вы видите строку номер 0, то скорее всего это произошло в процессе выполнения файла, указанного директивой auto_prepend.

    удачи.
     
  7. Фибер Оптик

    Фибер Оптик Новичок

    С нами с:
    16 май 2013
    Сообщения:
    4
    Симпатии:
    0