header("Location ...") - в одном случае работает, в другом - нет (крыша едет по полной...)

Модератор: Модераторы разделов

Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

header("Location ...") - в одном случае работает, в другом - нет

Сообщение Dionysius »

Такой код (скрипт, обрабатывающий данные формы для отсылки их на мыло):

проверяем, данные пришли именно из нашей формы?
если ДА, то include("file2.php")
иначе header("Location: на главную страницу сайта");

---------------file2.php-----------------
проверяем поля формы не были пустыми?
если НЕТ, то
чистим данные от спецсимволов, формируем тело письма
include("file3.php")
header("Location: на страницу формы, где сообщается, что письмо отправлено");

иначе header("Location: на страницу формы для повторного ввода данных");

---------------file3.php-----------------
include("class.phpmailer.php")
отправляем письмо

НО, header, выделенный красным, никуда не отправляет. Я уже куда только его не переставлял. Заменял его на meta-тег с атрибутом refresh, так прикол в том, что какой адрес для этого meta ни укажи, он всё равно перенаправляет браузер на главную страницу сайта.

На локальном сервере (под управлением Винды) всё работает, на удалённом сервере под управлением АльтЛинукс (php 4.3.11) красный header упирается по полной.

Может, кто в силах объяснить эту мистику? Может, проблема в большой вложенности скриптов (много include)? Как быть?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение serzh-z »

Black Lizard писал(а):
14.03.2006 13:37
include)? Как быть?

В file3.php возникают ошибки и он после него ничего уже не выполняется?
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение Dionysius »

serzh-z писал(а):
14.03.2006 14:12
Black Lizard писал(а):
14.03.2006 13:37

include)? Как быть?

В file3.php возникают ошибки и он после него ничего уже не выполняется?

Всё прекрасно работает, письмо отправляется.
Более того, до или после красного header'а можно вписать какой-нибудь код (echo "bla-bla", например) и он выполняется. А этот header просто забивает на всё...
Спасибо сказали:
The Ripper
Сообщения: 33

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение The Ripper »

До выполнения header в браузер ничего не должно быть выведено, с помощью echo, например.
Вместо include, используй лучше include_once.
Да и не проше ли сделать все это одним скриптом?
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение Dionysius »

The Ripper писал(а):
14.03.2006 15:02
До выполнения header в браузер ничего не должно быть выведено, с помощью echo, например.
Вместо include, используй лучше include_once.
Да и не проше ли сделать все это одним скриптом?

В браузер-то ничего не выводится. Поменял все include на include_once - не помогло. Одним скриптом - неудобно, форм будет несколько, а отправка сообщений одинаковая.

Вот как работает скрипт:

Код: Выделить всё

---------------file1.php---------------
$pos=strrpos($_SERVER["HTTP_REFERER"], "/");
$href=substr($_SERVER["HTTP_REFERER"], 0, $pos);
@include_once("../domens.php");
$flag=0;
foreach ($domens as $val)
{
   if (($href=="http://www.".trim($val)) || ($href=="http://".trim($val))) {$flag=1; break;}
}
if ($flag)
   {
@include_once("chk_".$_POST["formname"].".php");
   }
else header("Location: http://mysite.ru");
--------------domens.php------------------
содержит массив имён зеркал сайта
-----------------------chk_myform.php------------------
if (trim($_POST["val1"]) && trim($_POST["val2"]) && и т. д.)
      {
      $pattern="/[\'*\"*\`*\\*]/";
      $val1=preg_replace($pattern, "", $_POST["val1"]);
      и т. д.
      $subject="бла-бла";
      $body.="бла-бла".$val1;
      и т. д.
      @include_once("file2.php");

header("Location: http://mysite.ru/заявка?some_val=".$_POST["some_num"]."&some_val2=some_num");

Код: Выделить всё

      }
   else header("Location: http://mysite.ru/заявка?some_val=".$_POST["some_num"]."&some_val2=another_num");
---------------------------------------file2.php-----------------------------------------
setlocale(LC_ALL, 'ru_RU.CP1251');
require("../class.phpmailer.php");
$mail = new PHPMailer();
$mail->SetLanguage("ru", "../");
$mail->IsSMTP();
$mail->Host = "localhost;localhost";

$mail->From = "robot@mysite.ru";
$mail->FromName = "Robot";
$mail->AddAddress("my_addr@mysite.ru");

$mail->WordWrap = 50;
$mail->IsHTML(true);

$mail->Subject = $subject;
$mail->Body    = $body;

$mail->Send();

Есть ещё идеи?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение KiWi »

Black Lizard писал(а):
15.03.2006 06:38
Есть ещё идеи?

BOM
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение Dionysius »

IFL писал(а):
15.03.2006 07:28
BOM

Чего??
Спасибо сказали:
The Ripper
Сообщения: 33

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение The Ripper »

Цитата:
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called.

Посмотри включаемые *.php-файлы на предмет того, чтоб после "?>" не было никаких пробелов и т.д.
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: header("Location ...") - в одном случае работает, в другом - нет

Сообщение Dionysius »

The Ripper, благодарю за помощь. B) header отказывался выполняться по причине предстоящего перед ним кода, если код удалить, header работает. Надо скрипт переписать.
Спасибо сказали: