Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ошибка перенаправления header
 
 автор: Black__Hole   (03.08.2009 в 12:29)   письмо автору
 
 

Подскажите, пожалуйста, в такой ситуации:
при неправильном заполнении пользователем формы идет перенаправление на страницу с формой с помощью функции header. Однако браузер выдает ошибку "Warning: Cannot modify header information - headers already sent by " в строке с функцией header.


<body>
<?php

$pat 
'^([a-z0-9\._\-]+)@([a-z0-9\.\-]+)(\.[a-z]{2,})$';
$txt_pat "/[^0-9A-Za-z '\.А-яЁё-]+/";

$tomail="mail@yandex.ru";
$result $_GET["id"];

$name $_POST["name"];
$mail $_POST["mail"];
$phone $_POST["phone"];

  
$state_msg='';
  
  
$name = (isset($name)? preg_replace($txt_pat""$oname) : "");
  
$mail = ((isset($mail) && eregi($pat,$mail))? strtolower($mail) : "");

  if (empty(
$name)) {
     
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: не указано Ваше имя';
                                  }
      elseif (empty(
$mail)) {
          
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: неверный формат (или не указан) e-mail';
                                      }
      elseif (empty(
$phone)) {
        
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: не указан Ваш телефон';
                                      }
                                
    if (
$state_msg != "") {
    
header("Refresh: 3; URL=W:\home\localhost\www\php\calc.php");
    echo 
"<br> $state_msg <br> Через 3 сек. Вы будете перенаправлены на страницу заполнения формы";
    exit;  
                                }
    else {

        
$tomail "mail@yandex.ru";
        
$sub "На сайте были оствлены контакты";
        
$mes "Сумма составила $result (руб.) \n Данные по Отправителю: \n Имя: $name \n E-mail: $mail \n Телефон: $phone";
    
        
$send mail ($address$sub$mes"Content-type:text/plain; charset = utf-8");

            if(
$send == "true")
                {
                    echo 
"Спасибо, Ваше сообщение отправлено! ";
                    }
            }

?>

</body>

  Ответить  
 
 автор: Trianon   (03.08.2009 в 12:39)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 12:29)
 

потому что перед php-кодом уже выведен html-код ( вчастлости <body> )
Не может заголовок идти после тела.
Диагностику ошибок нужно полностью читать и приводить.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 13:10)   письмо автору
 
   для: Trianon   (03.08.2009 в 12:39)
 

Я уже попробовала разместить код до <body> - ошибка определяется в строке тега <?php
Просто не представляю, как можно реализовать перенаправление на исходную страницу ДО начала работы php - ведь именно в результате работы php выясняется, будет ли пользователь перенаправлен.. :(

  Ответить  
 
 автор: Trianon   (03.08.2009 в 13:22)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 13:10)
 

Убедитесь, что перед <?php нет пустых строк, пробелов, табов и прочих пустых символов вроде BOM.

Если в файле первым байтом является < то такая ошибка выскакивать не будет.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 13:38)   письмо автору
 
   для: Trianon   (03.08.2009 в 13:22)
 

Только что почистила файл от BOM с помощью утилиты utf8-bom-remover. Не помогло.
Код до <?php содержит только нижеследующее. Я, вероятно, не вижу самой очевидной ошибки?


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Страница заказа</title>
<?php

  Ответить  
 
 автор: speedsoft   (03.08.2009 в 13:53)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 13:38)
 

ну так это же выводится в браузер, выводите это все после header.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 14:11)   письмо автору
2.5 Кб
 
   для: speedsoft   (03.08.2009 в 13:53)
 

Поставила весь код php с первой строки файла. Браузер все равно выдает ошибку "Warning: Cannot modify header information - headers already sent by (output started at W:\home\localhost\www\php\zakaz.php:1) in.. " Т.е. с той самой первой строки, где идет


<?php
$pat 
"^([a-z0-9\._\-]+)@([a-z0-9\.\-]+)(\.[a-z]{2,})$";


и так далее. В чем же ошибка?
Во вложении сам файл php.

  Ответить  
 
 автор: Trianon   (03.08.2009 в 14:12)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 13:38)
 

вот этого всего там быть не должно.

Можете поставить его позже, после того, как никаких header'ов не останется.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 14:42)   письмо автору
 
   для: Trianon   (03.08.2009 в 14:12)
 

Вы имеете в виду, выводить header, а потом уже php-код? но ведь у меня решение о перенаправлении принимается только после работы php.

  Ответить  
 
 автор: Саня   (03.08.2009 в 16:36)   письмо автору
145 байт
 
   для: Black__Hole   (03.08.2009 в 14:42)
 

Положите файл из архива в папку со скриптами.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 17:15)   письмо автору
 
   для: Саня   (03.08.2009 в 16:36)
 

Положила. Не помогает. :(

  Ответить  
 
 автор: Саня   (03.08.2009 в 17:44)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 17:15)
 

Вы читали статю по ссылке что я дал?

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 18:10)   письмо автору
 
   для: Саня   (03.08.2009 в 17:44)
 

Да, читала. И разбор выводимой браузером ошибки провела. Ошибка определяется в первой же строке файла, которая содержит только открывающий тэг php. Это мне исправить не удается.

  Ответить  
 
 автор: Саня   (03.08.2009 в 18:14)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 18:10)
 

В файле php.ini присвойте директиве output_buffering значение on.

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 18:48)   письмо автору
 
   для: Саня   (03.08.2009 в 18:14)
 

Присвоила. Не помогает. А Вы видели приложенный мною файл php?

  Ответить  
 
 автор: Саня   (03.08.2009 в 19:35)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 18:48)
 

После этого действия нужно перезагрузить веб-сервер. Не забыли?
Файл видел. Ничего необычного, чтобы вызывало такую реакцию, в нём нет

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 20:38)   письмо автору
 
   для: Саня   (03.08.2009 в 19:35)
 

Нет, не забыла. Целый день с этой утомительной ошибкой :(
Пришлось прибегнуть к кардинально иному решению задачи.
Спасибо Вам и всем участвовавшим за помощь!

  Ответить  
 
 автор: speedsoft   (03.08.2009 в 12:40)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 12:29)
 

Это из-за того что до вызова header у вас в браузер выводились символы. Чтобы функция работала НИОДНОГО чимвола не должно выводиться перед выводом. (даже пробела или Интера).

В вашем случае вывелось


<body>

  Ответить  
 
 автор: Саня   (03.08.2009 в 12:41)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 12:29)
 

Поиском пользоваться не пробовали?
http://www.phpfaq.ru/headers

  Ответить  
 
 автор: mehelson   (03.08.2009 в 12:46)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 12:29)
 

Попробуйте так:
<? echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=calc.php'></HEAD></HTML>";?>

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 13:07)   письмо автору
 
   для: mehelson   (03.08.2009 в 12:46)
 

Так не работает :(

  Ответить  
 
 автор: Trianon   (03.08.2009 в 13:20)   письмо автору
 
   для: mehelson   (03.08.2009 в 12:46)
 

>Попробуйте так:
><? echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=calc.php'></HEAD></HTML>";?>

не надо этой дряни!!!

Человек столкнулся с трудностью, как ему поле заголовка отправить, а Вы ему костыль всучить пытаетесь.

  Ответить  
 
 автор: speedsoft   (03.08.2009 в 13:26)   письмо автору
 
   для: Black__Hole   (03.08.2009 в 12:29)
 

<?php

$pat 
'^([a-z0-9\._\-]+)@([a-z0-9\.\-]+)(\.[a-z]{2,})$';
$txt_pat "/[^0-9A-Za-z '\.А-яЁё-]+/";

$tomail="mail@yandex.ru";
$result $_GET["id"];

$name $_POST["name"];
$mail $_POST["mail"];
$phone $_POST["phone"];

  
$state_msg='';
  
  
$name = (isset($name)? preg_replace($txt_pat""$oname) : "");
  
$mail = ((isset($mail) && eregi($pat,$mail))? strtolower($mail) : "");

  if (empty(
$name)) {
     
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: не указано Ваше имя';
                                  }
      elseif (empty(
$mail)) {
          
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: неверный формат (или не указан) e-mail';
                                      }
      elseif (empty(
$phone)) {
        
$state_msg='ВНИМАНИЕ! При заполнении формы выявлена ошибка: не указан Ваш телефон';
                                      }
                                
    if (
$state_msg != "") {
    
header("Refresh: 3; URL=W:\home\localhost\www\php\calc.php");
    echo 
"<body><br> $state_msg <br> Через 3 сек. Вы будете перенаправлены на страницу заполнения формы";
    exit;  
                                }
    else {

        
$tomail "mail@yandex.ru";
        
$sub "На сайте были оствлены контакты";
        
$mes "Сумма составила $result (руб.) \n Данные по Отправителю: \n Имя: $name \n E-mail: $mail \n Телефон: $phone";
    
        
$send mail ($address$sub$mes"Content-type:text/plain; charset = utf-8");
echo 
"<body>";
            if(
$send == "true")
                {
                    echo 
"Спасибо, Ваше сообщение отправлено! ";
                    }
            }

?>

</body> 


Но учтите, если у вас файл в формате UTF-8, то сохраняйте его без BOM. иначе вроде все красиво, а невидимый символ выводится. Сам давно попался на эту шнягу.

  Ответить  
 
 автор: xxxxxxxx   (03.08.2009 в 15:11)
 
   для: speedsoft   (03.08.2009 в 13:26)
 

тогда лучше
$name = (isset($name)? trim(preg_replace($txt_pat, "", $oname)) : "")
чтобы небыло имени из одних пробелов если например "# #" придёт

$result = intval($_GET["id"]); наверное или floatval()
но тогда могут быть отрицательные числа или могут нечисла становиться числами.

про $phone и $mail и get_magic_quote_gps() лучше промолчу

  Ответить  
 
 автор: xxxxxxxxx   (03.08.2009 в 15:25)
 
   для: xxxxxxxx   (03.08.2009 в 15:11)
 

get_magic_quotes_gpc();

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 16:14)   письмо автору
 
   для: xxxxxxxx   (03.08.2009 в 15:11)
 

В коде есть строки по этому поводу - я для краткости их не приводила просто:
$name = htmlspecialchars(trim($name));
$mail = htmlspecialchars(trim($mail));
$phone = htmlspecialchars(trim($phone));

  Ответить  
 
 автор: .......   (03.08.2009 в 16:52)
 
   для: Black__Hole   (03.08.2009 в 16:14)
 

$name = $_POST [ "name ];
$name = (isset( $name )? preg_replace ( $txt_pat , "" , $ oname ) : "" );

сначала устанавливаете переменную
а потом проверяете установленна.ли она
а вслучае неустановленнойф $_POST[name] будет notice
$oname наверно опечатка

  Ответить  
 
 автор: Black__Hole   (03.08.2009 в 17:21)   письмо автору
 
   для: .......   (03.08.2009 в 16:52)
 

Да, все так и делаю. С опечаткой Вы правильно заметили - это в ходе переноса кода на форум. Сам файл со скриптом выложен в моем сообщении выше (адресовано другому пользователю)

  Ответить  
 
 автор: .......   (04.08.2009 в 13:02)
5 Кб
 
   для: Black__Hole   (03.08.2009 в 17:21)
 

тяжёлый случай :)

вот можно локально потестить например такой способ , совсем без редиректов, где форма и отправка в одном файле

, но насчёт багов не сильно уверен , хотя и совсем без htmlspecialchars()

добавлено ограничение частоты отправок и обязательность включённых cookies

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования