|
|
|
| Подскажите, пожалуйста, в такой ситуации:
при неправильном заполнении пользователем формы идет перенаправление на страницу с формой с помощью функции 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>
|
| |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 12:29)
| | потому что перед php-кодом уже выведен html-код ( вчастлости <body> )
Не может заголовок идти после тела.
Диагностику ошибок нужно полностью читать и приводить. | |
|
|
|
|
|
|
|
для: Trianon
(03.08.2009 в 12:39)
| | Я уже попробовала разместить код до <body> - ошибка определяется в строке тега <?php
Просто не представляю, как можно реализовать перенаправление на исходную страницу ДО начала работы php - ведь именно в результате работы php выясняется, будет ли пользователь перенаправлен.. :( | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 13:10)
| | Убедитесь, что перед <?php нет пустых строк, пробелов, табов и прочих пустых символов вроде BOM.
Если в файле первым байтом является < то такая ошибка выскакивать не будет. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 13:38)
| | ну так это же выводится в браузер, выводите это все после header. | |
|
|
|
|
 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. | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 13:38)
| | вот этого всего там быть не должно.
Можете поставить его позже, после того, как никаких header'ов не останется. | |
|
|
|
|
|
|
|
для: Trianon
(03.08.2009 в 14:12)
| | Вы имеете в виду, выводить header, а потом уже php-код? но ведь у меня решение о перенаправлении принимается только после работы php. | |
|
|
|
|
 145 байт |
|
|
для: Black__Hole
(03.08.2009 в 14:42)
| | Положите файл из архива в папку со скриптами. | |
|
|
|
|
|
|
|
для: Саня
(03.08.2009 в 16:36)
| | Положила. Не помогает. :( | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 17:15)
| | Вы читали статю по ссылке что я дал? | |
|
|
|
|
|
|
|
для: Саня
(03.08.2009 в 17:44)
| | Да, читала. И разбор выводимой браузером ошибки провела. Ошибка определяется в первой же строке файла, которая содержит только открывающий тэг php. Это мне исправить не удается. | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 18:10)
| | В файле php.ini присвойте директиве output_buffering значение on. | |
|
|
|
|
|
|
|
для: Саня
(03.08.2009 в 18:14)
| | Присвоила. Не помогает. А Вы видели приложенный мною файл php? | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 18:48)
| | После этого действия нужно перезагрузить веб-сервер. Не забыли?
Файл видел. Ничего необычного, чтобы вызывало такую реакцию, в нём нет | |
|
|
|
|
|
|
|
для: Саня
(03.08.2009 в 19:35)
| | Нет, не забыла. Целый день с этой утомительной ошибкой :(
Пришлось прибегнуть к кардинально иному решению задачи.
Спасибо Вам и всем участвовавшим за помощь! | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 12:29)
| | Это из-за того что до вызова header у вас в браузер выводились символы. Чтобы функция работала НИОДНОГО чимвола не должно выводиться перед выводом. (даже пробела или Интера).
В вашем случае вывелось
| |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 12:29)
| | Поиском пользоваться не пробовали?
http://www.phpfaq.ru/headers | |
|
|
|
|
|
|
|
для: Black__Hole
(03.08.2009 в 12:29)
| | Попробуйте так:
<? echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=calc.php'></HEAD></HTML>";?>
|
| |
|
|
|
|
|
|
|
для: mehelson
(03.08.2009 в 12:46)
| | Так не работает :( | |
|
|
|
|
|
|
|
для: mehelson
(03.08.2009 в 12:46)
| | >Попробуйте так:
><? echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=calc.php'></HEAD></HTML>";?>
не надо этой дряни!!!
Человек столкнулся с трудностью, как ему поле заголовка отправить, а Вы ему костыль всучить пытаетесь. | |
|
|
|
|
|
|
|
для: 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(); | |
|
|
|
|
|
|
|
для: 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 наверно опечатка | |
|
|
|
|
|
|
|
для: .......
(03.08.2009 в 16:52)
| | Да, все так и делаю. С опечаткой Вы правильно заметили - это в ходе переноса кода на форум. Сам файл со скриптом выложен в моем сообщении выше (адресовано другому пользователю) | |
|
|
|
|
автор: ....... (04.08.2009 в 13:02)  5 Кб |
|
|
для: Black__Hole
(03.08.2009 в 17:21)
| | тяжёлый случай :)
вот можно локально потестить например такой способ , совсем без редиректов, где форма и отправка в одном файле
, но насчёт багов не сильно уверен , хотя и совсем без htmlspecialchars()
добавлено ограничение частоты отправок и обязательность включённых cookies | |
|
|
|