Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > опять редирект


Автор: sugee 13.10.2005, 20:37
Наверное эта тема уже всех достала...
После отправки формы делаю перенаправление на ту же страницу и получаю:
Код

Warning: Cannot modify header information - headers already sent by
(output started at адрес скрипта)
 in адрес скрипта on line 62

Наверное придется показать полный код
Код

<html><body background=BGFON.jpg>
<script language="javascript">
function smile(num)
{
text=mygb.message.value;
mygb.message.value=text+" <img src=smiles/"+num+".gif>";
}
</script>
<form name=mygb action=gb3.php METHOD=post><input type=text name=name>&nbsp<b>Имя</b><br>
<input type=text name=email>&nbsp<b>E-mail</b><br><br><b>Сообщение</b><br>
<textarea rows=8 cols=25 name=message></textarea><br><input type=submit name=sbm value=добавить><br><br>
 
<table><tr align=center>
<?
$dir=opendir("./smiles");
  while(($n=readdir($dir))!==false)
    if(!is_dir($n)) $smiles[]=$n;

for($i=0;$i<count($smiles);$i++)
{
?>
<td><img src='smiles/<? echo"$i.gif"?>' onclick="smile('<?=$i?>')" 
onMouseover="this.style.cursor='hand'" onMouseout="this.style.cursor=''">&nbsp&nbsp</td>
<?
}
?>
</tr></table>
<?
Error_Reporting(E_ALL & ~E_NOTICE);
$f="./gb.txt";
$tmp="./gb_tmp.txt";
if($_POST['sbm']) {

$message=str_replace("\n", "<br>", $_POST['message']);
  
 if(!preg_match("/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/",$_POST['email'])) {
 $err="Неверный E-mail адрес! ";
 }
 if($_POST['name']=="") $err.="Забыли ввести имя! ";
 if($_POST['message']=="") $err.="Забыли ввести сообщение! ";
 if(strlen($message)>70&&strpos($message," ")==false)
  $err.="Слишком длинная строка";


 if($err) {
 echo "<font color=red>".$err."</font>";
}
else {
if(copy($f,$tmp)) {
$w=fopen($f,"w");
flock($w,2); 
fwrite($w,date("d.m.Y. H:i:s")."|".$_POST['email']."|"." ".$_POST['name']."|"." ".$message."\n");
$r=fopen($tmp,"r");
flock($r,1);
while($messages=fgets($r,1000)) fputs($w, $messages);
flock($r,3);
fclose($r);
flock($w,3);
fclose($w);
unlink($tmp);
  }
 header("Location".$_SERVER['REQUEST_URI']);
 exit;
 }
}

$page=isset($_GET['page']) ? $_GET['page'] : 1; 
show($page);

function show($page) {
global $f;
$kol=$page*10;
$messages=explode('\n',implode('\n',file($f)));
echo "<table width=100% border=1><tr><td><table  border=0>";
for($i=($page-1)*10; $i<count($messages); $i++) {
  if($i<$kol) {
$mess=explode("|",$messages[$i]);
list($date,$email,$name,$message)=$mess;

echo "<tr height=40><td background='BGF.jpg'><b>
<font color=#ffffff>Сообщение от ".$name." </font></b>
<br>&nbsp&nbsp<b>".$email."</b></td><td background='BGF.jpg'><b>".$date."</b></td></tr>
<tr><td width=100% height=100>".$message."</td></tr>";
  }
}
echo "</table></td></tr></table><br>";

$num=count($messages);
$numstr=ceil($num/10);
   $count=1;
for($k=1; $k<=$numstr; $k++) {
  if(count($messages)>=$count) echo "&nbsp&nbsp<a href=gb3.php?page=$k>$k</a>";
   $count+=10;
  }
}
?>
</body></html>


Автор: Mal Hack 13.10.2005, 20:58
Блин, ну header'ы посылаться должны до любого вывода. Пробел, перевод строки перед <?php - тоже вывод...
Спецификацию читайте..

Автор: Bastet 13.10.2005, 21:02
sugee, ну еще бы ты не получал сообщение об ошибке... Все заголовки (header()) должны отправляться ДО вывода любого текста в браузер.
Говорят, помогает буферизация...
Буферизоция включается в самом начале страницы:
Код

ob_start();

Когда весь текст выведен, содержимое буфера копируется в некоторую переменную:
Код

$text = ob_get_contents();

Потом буферизация отключается:
Код

ob_end_clean();

и содержимое буфера выводится:
Код

print $text;

Автор: sugee 14.10.2005, 18:28
Я перенес весь блок
Код

 <?  if(isset($_POST['sbm'])) {
   ........
 }
?>

в самое начало скрипта, но результат тот же.
Если форма заполнена правильно, там не должно
быть никакого вывода.
Что то я не пойму, куда надо вставить этот header?

Автор: PARROT 14.10.2005, 18:57
Код

<?php
ob_start();
?>
<?
<html>
<head>
<Meta http-equiv="content-type" Content="text/html; charset=Windows-1251">
<HEAD>
<title>Василий</title>
</head>
<body topmargin="0" leftmargin="0" bottommargin="0">
<!------------Туту посылаешь что тебе нужно и куда нужно, например:----------->
<?  if(isset($_POST['sbm'])) {
   echo "СПАТЬ!";
header('location: index.php');
exit;
 }
?>
</body>
</html>
<?php
ob_end_flush();
?>

Автор: sugee 14.10.2005, 20:06
УРА!!! smile

Автор: krulik 8.2.2006, 13:00
Чтобы отдельно тему не создавать спрошу вот тут.
Итак есть вот такой код (для примера):
Код

<?php    
ob_start();    
?>
<html>
<body>
<?php
if (isset($_POST['old']))
{
   /*тут чтото проверили посчитали...*/
   print "Тут выводим какойто текст";
}
else print "Тут тоже чтото выводим";
header("Location: redDb.php");
?>
</body>
</html>
<?php    
ob_end_flush();    
?>


А теперь вопрос. В таком виде происходит просто переадресация на некую страницу redDb.php. Но как вы понимаете пользователь не видит никаких сообщений (ни про ошибку ни про то что все нормально).
Скажите пожалуйста каким образом можно сделать так чтобы перед переадресацией выводилось на какоето время информационное окно с сообщением (сообщения которые в 10 и 12 троках).

Автор: smartov 8.2.2006, 15:37
krulik
Тут тебе только javascript поможет
Код

<?php    
ob_start();    
?>
    
<html>
<body>
<?php
if (isset($_POST['old']))
{
   /*тут чтото проверили посчитали...*/
    $html = '<script>alert("'."Тут выводим какойто текст".'");</script>';
    echo $html;
} 
else
{
    $html = '<script>alert("'."Тут тоже чтото выводим".'");</script>';
    echo $html;
}

$html = '<script>document.location.href="redDb.php";</script>';
echo $html;

?>
</body>
</html>
    
<?php    
ob_end_flush();    
?>

Автор: krulik 8.2.2006, 15:58
smartov огромное спасибо!!! Все работает! Буду паралельно и ЯвуСкрипт начинать учить (книжку как раз уже купил)

Автор: smartov 8.2.2006, 18:19
krulik
Цитата(krulik @ 8.2.2006, 14:58 Найти цитируемый пост)

ЯвуСкрипт начинать учить (книжку как раз уже купил)

Мануал не забудь хороший слить. А так же вот http://program.rin.ru/razdel/html/106.html хорошее описание обьектов. Чтобы потом голову не ломать.

Ну а дальше - учите мать часть smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)