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


Автор: vitalina 1.9.2008, 11:21
Это основной файл:
Код


<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">


<TITLE>dfg.html</TITLE>
</HEAD>
<style type="text/css">
BODY { 
overflow: hidden; /*prokrutka*/
 background-image: url('web_jurm.gif'); /* */
 background-position: center top; /*  */
 background-repeat: repeat-y; /* */
background-color:transparent; /*cvet fona*/


}
.div1 {
  border: #000000 1px solid;
/*  float: left;
  width: 100px;
  height: 550px; */
  width:780px;
  height: 20px;
  background-color: #6666ff;
  margin-top:0px;

}
a:visited {
   color: #00CC00;
   text-decoration:none;
   font-weight: bolder;
}

a:link {
   color: #9900FF;
   text-decoration:none;
   font-weight: bolder;

}

a:hover {
   color: #9900FF;
   text-decoration:underline;
   font-weight: bolder;
}

a:active {
   color: #FF0000;
   text-decoration:underline;
   font-weight: bolder;
}


.div2 {
  border: #000000 1px solid;
/*  float: right;
  width: 600px;
  height: 550px;     */
  width:780px;
  height: 361px;
 /* background-color: #87CEEB;*/
background-color: #ffffff;



}


</style>

<BODY topmargin="0" leftmargin="0">

<table align="center" border="0"><tr><td valign="top">
 <div class="div1" align="center">

 <a href="index.php?page=portfolio">Портфолио</a>


  </div>

<div class="div2" >


    <div style="margin-top: 0px; margin-left: 7px;">

    <?php


if (isset($_GET['page'])) {
    //навигация

//переменная "где вы находитесь"
$history = ' <a href="index.php">Главная страница</a>';
//прием переменной $pages
switch( $_GET['page'] ) {

    //если выбрано books
    case "portfolio":
        //добавляем продолжение "пути"
        $history .= '/ <a href="index.php?page=portfolio">Портфолио</a>';
        echo $history;
     
        break;
    
    //если выбрано главная страница
    default:
        echo $history;
      
        break;
};

  //навигация

//переменная "где вы находитесь"
$history = ' <a href="index.php">Главная страница</a>';
//прием переменной $pages
switch( $_GET['pa'] ) {

   
    case "fbm":
        //добавляем продолжение "пути"
        $history2 = '/ <a href="index.php?page=portfolio&pa=fbm">ФБМ</a>';
        echo $history2;
      
        break;
    case "grafika":
        //добавляем продолжение "пути"
        $history2 = '/ <a href="index.php?page=portfolio&pa=fbm">Графика</a>';
        echo $history2;
      
        break;
  
       
    //если выбрано главная страница
    default:
        echo $history2;
     
        break;
};
    include($_GET['page'].'.php');

}

else
{


include('formafail.php');



}
?>
    </div>

</div>
<div class="div1" align="center">
 Контакты


  </div>
</td></tr></table>

</BODY>
</HTML>



Файл с формой:

Код

<?php
Error_Reporting(E_ALL & ~E_NOTICE);

//переменная ошибок
$error=array();

//обработчик формы 
if (!empty($_POST))
{
    //проверка параметра
    //функция str_replace() необходима чтобы вырезать переводы строк ( \n ) 
    $var=str_replace("\n",'',trim($_POST['var']));
    if (empty($var))
    $error['empty']='не введен параметр';
    

    //если все нормально пишем в файл
    if (empty($error))
    {
        //открываем
        $f=fopen('db.txt','a+');
        
        //блокируем 
        flock($f,2);
        
        //запись с переводом строки
        fwrite($f,$var."\n");
         //32

        //закрытие
        fclose($f);
        
        /*переадресация , чтобы сбросить пост, это нужно чтобы при нажатии кнопки обновить 
         данные не добавились вновь*/
    header('Location: '.$_SERVER["PHP-SELF"].'?ok=1'); // [color=orangered]не срабатывает[/color]
     die();
    }
}

//если есть ошибки выводим
if (!empty($error))
echo '<p>'.implode('<br />',$error).'</p>';

if (isset($_GET['ok'])) 
{

echo '<br><br>Выберите наверху один из разделов сайта!';

} else {



//сама форма
?>

<form action="<?=$_SERVER["PHP-SELF"];?>" method="post"> //[color=orangered]ругается[/color]
<p>
Сколько Вам лет?:<br />
<input name="var" value="<?=isset($_POST['var']) ? htmlspecialchars(stripslashes(trim($_POST['var']))) : '';?>" /><br />
<input type="submit" value="отправить" />
</p>
</form>
<?php
}


?> 


В результате на главной странице вы даёт:

Warning: Cannot modify header information - headers already sent by (output started at C:\Documents and Settings\kornijenkon\Desktop\index.php:9) in C:\Documents and Settings\kornijenkon\Desktop\formafail.php on line 35

Автор: americanets 1.9.2008, 13:06
vitalina, нельзя ничего принтить эхоть , вобщем выводить до   header , иначе он тебе и пишет то, что  заголовки уже отправлены

Автор: vitalina 1.9.2008, 13:08
Ti imeesh vvidu formu do header? Ja probovala, ne polu4aetsja. 

Автор: Wheels 1.9.2008, 13:19
в каком месте выводится форма? Обратите внимание, что что-то уже выведено до header.


попробуйте открыть страницу с ошибкой в виде кодам в браузере, иногда помогает)

Долго разбираться не стал, но по-моему у Вас инклюдится файл с формой уже после того, как выведено это:

Код

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">


<TITLE>dfg.html</TITLE>
</HEAD>
<style type="text/css">
BODY { 
overflow: hidden; /*prokrutka*/
 background-image: url('web_jurm.gif'); /* */
 background-position: center top; /*  */
 background-repeat: repeat-y; /* */
background-color:transparent; /*cvet fona*/


}
.div1 {
  border: #000000 1px solid;
/*  float: left;
  width: 100px;
  height: 550px; */
  width:780px;
  height: 20px;
  background-color: #6666ff;
  margin-top:0px;

}
a:visited {
   color: #00CC00;
   text-decoration:none;
   font-weight: bolder;
}

a:link {
   color: #9900FF;
   text-decoration:none;
   font-weight: bolder;

}

a:hover {
   color: #9900FF;
   text-decoration:underline;
   font-weight: bolder;
}

a:active {
   color: #FF0000;
   text-decoration:underline;
   font-weight: bolder;
}


.div2 {
  border: #000000 1px solid;
/*  float: right;
  width: 600px;
  height: 550px;     */
  width:780px;
  height: 361px;
 /* background-color: #87CEEB;*/
background-color: #ffffff;



}


</style>

<BODY topmargin="0" leftmargin="0">

<table align="center" border="0"><tr><td valign="top">
 <div class="div1" align="center">

 <a href="index.php?page=portfolio">Портфолио</a>


  </div>

<div class="div2" >


    <div style="margin-top: 0px; margin-left: 7px;">

Автор: americanets 1.9.2008, 13:21
vitalina, + у вас utf , обратите внимание на bom символы

Автор: vitalina 1.9.2008, 13:28
Wheels,  da i 4to?


americanets, na kakie simvoli? Poponjatnee mozhno?

Автор: americanets 1.9.2008, 13:42
vitalina, http://en.wikipedia.org/wiki/Byte-order_mark

Автор: vitalina 1.9.2008, 13:47
Ja ne ponjala! Objasni sam.

Автор: Wheels 1.9.2008, 14:00
Header прописан в файле с формой, так?

А файл с формой инклюдится в другой файл. А в этом другом файле до того, как заинклюдится файл с формой уже отдали кучу информации пользователю:
Код

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">


<TITLE>dfg.html</TITLE>
</HEAD>
<style type="text/css">
BODY { 
overflow: hidden; /*prokrutka*/
 background-image: url('web_jurm.gif'); /* */
 background-position: center top; /*  */
 background-repeat: repeat-y; /* */
background-color:transparent; /*cvet fona*/


}
.div1 {
  border: #000000 1px solid;
/*  float: left;
  width: 100px;
  height: 550px; */
  width:780px;
  height: 20px;
  background-color: #6666ff;
  margin-top:0px;

}
a:visited {
   color: #00CC00;
   text-decoration:none;
   font-weight: bolder;
}

a:link {
   color: #9900FF;
   text-decoration:none;
   font-weight: bolder;

}

a:hover {
   color: #9900FF;
   text-decoration:underline;
   font-weight: bolder;
}

a:active {
   color: #FF0000;
   text-decoration:underline;
   font-weight: bolder;
}


.div2 {
  border: #000000 1px solid;
/*  float: right;
  width: 600px;
  height: 550px;     */
  width:780px;
  height: 361px;
 /* background-color: #87CEEB;*/
background-color: #ffffff;



}


</style>

<BODY topmargin="0" leftmargin="0">

<table align="center" border="0"><tr><td valign="top">
 <div class="div1" align="center">

 <a href="index.php?page=portfolio">Портфолио</a>


  </div>

<div class="div2" >


    <div style="margin-top: 0px; margin-left: 7px;">


До того места, где в коде встречается функция Header не должно быть ниодного символа, который бы был отдан пользователю, а у Вас - целая поэма). Как-то так.

Добавлено через 1 минуту и 34 секунды
Тут нужно целиком структуру пересматривать. Изначально неправильно "скелет" построен. Или уже отказываться от заголовков (перенаправления с помощью header).

Добавлено через 5 минут и 24 секунды
На вскидку: объедините файл с формой с основным файлом и сделайте обработку формы еще ДО вывода 
Код

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">

и т.д.


если это возможно, конечно.

Автор: americanets 1.9.2008, 14:20
vitalina, про bom , некоторые редакторы сохраняют файлы с bom символами, те до вызова header  у тебя по любой что то будет, делаешь сохранить как, в чем ты там пишешь  и ставишь опцию без bom .

А у тебя проблема с
Код

 include('formafail.php');


реши что сделать с  
Код

header('Location: '.$_SERVER["PHP-SELF"].'?ok=1'); // [color=orangered]не срабатывает[/color]

Автор: vitalina 1.9.2008, 14:22
Peresmotretj strukturu? kak?  


ja ho4u 4tobi bilo tak:


------------------------------
menu
------------------------------
content



------------------------------
memo
------------------------------

u menja ssilki menju otkrivajutsja v contente. V contente ho4u, 4tob bila forma. Posle nazhatija knopki v contente bil text, 4to vse zapisano i nizhe bili bi novosti sajta. I 4tob header rabotal.  Napishite kod, kak bi vi eto sdelali.

Автор: americanets 1.9.2008, 14:27
вынеси всю обработку до принта в браузер

Автор: vitalina 1.9.2008, 14:32
Ne polu4aetsja!

Добавлено через 33 секунды
 smile  smile 

Автор: Wheels 1.9.2008, 14:34
Да как-то так... другое дело, что это уже мешанина...  Это с обязательным условием наличия Header, правда он тут уже нафиг не нужен)

Код

<?
If (isset($sent))
{
....Обработка формы.....

   If(обработано успешно)
   {
         Header(на этот же файл?submit=ok)
   }
   else
   {
         Header(на этот же файл?submit=error)
   }


}
?>
<html>
<head>
</head>
<body>
....

<?
if (isset($submit))
{
   if ($submit=='ok')
   {
        echo '...Сообщение успешно отправлено...';
   }
   elseif ($submit=='error')
   {
        echo $error; 
   }
   else
   {
?>
<form action="на этот же файл">
<input type text>
...
<input type=submit name=sent>
</form>
<?
}
?>
</body>

Автор: vitalina 1.9.2008, 14:39
Po4emu ne nuzhen. Ja header delaju, 4tobi ne bilo povtornoj otpravki. V kommentah napisano.

Автор: americanets 1.9.2008, 14:43
Цитата(vitalina @  1.9.2008,  15:39 Найти цитируемый пост)
Po4emu ne nuzhen. Ja header delaju, 4tobi ne bilo povtornoj otpravki. V kommentah napisano. 


ну дык и сделай его до вывода хтмл в браузер

Автор: Wheels 1.9.2008, 14:47
ну и сделайте обработку в отдельном фале.  А форму в главном, экшн с формы на файл с обработкой, а с этого файл хэдэр уже куда хотите.

Только помните, что так:
Код

<html>
<?
header(...);
?>
Работать не будет

будет работать так:
Код

<?
header(...);
?>
<html>
Это и есть суть ошибки.

Автор: vitalina 1.9.2008, 15:16
Tak?

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>Hello!</title>
</head>

<body>

<?
If (isset($sent))
{
//переменная ошибок
$error=array();

//обработчик формы
if (!empty($_POST))
{
    //проверка параметра
    //функция str_replace() необходима чтобы вырезать переводы строк ( \n )
    $var=str_replace("\n",'',trim($_POST['var']));
    if (empty($var))
    $error['empty']='не введен параметр';
        //если все нормально пишем в файл
    if (empty($error))
    {        //открываем
        $f=fopen('db.txt','a+');

        //блокируем
        flock($f,2);

        //запись с переводом строки
        fwrite($f,$var."\n");
         fclose($f);

        /*переадресация , чтобы сбросить пост, это нужно чтобы при нажатии кнопки обновить
         данные не добавились вновь*/
    header('Location: '.$_SERVER["PHP-SELF"].'?submit=ok');
      //   die();
      }
     else
  {
            header('Location: '.$_SERVER["PHP-SELF"].'?submit=error');
  }


        }
}


?>
<html>
<head>
</head>
<body>
....
<?
//если есть ошибки выводим

if (isset($submit))
{
   if ($submit=='ok')
   {
        echo '...Сообщение успешно отправлено...';
   }
   elseif ($submit=='error')
   {
        echo '<p>'.implode('<br />',$error).'</p>';
   }
   else
   {
?>
<form action="<?=$_SERVER["PHP-SELF"];?>" method="post">
<p>
Сколько Вам лет?:<br />
<input name="var" value="<?=isset($_POST['var']) ? htmlspecialchars(stripslashes(trim($_POST['var']))) : '';?>" /><br />
<input type="submit" value="отправить" name=sent/>
</p>
</form>


<?
} }
?>
</body>

</html>



U menja formi voobshe nikakoj ne risuetsja! smile  smile 


Автор: americanets 1.9.2008, 15:21
а что изменилось кроме того что вместо инклюда перенесен код ? не надо хотеть пример , нужно взять и попробовать что то сделать 

Автор: vitalina 1.9.2008, 15:24
A ja 4to ne probuju????????/ smile 

Автор: americanets 1.9.2008, 15:40
Код

<?php
    $error = array();
if (!empty($_POST))
{

    if ( empty($_POST['chtoto']) ) {
     $error[] = 'cto to net';
    } else {
         header('location : index.php');
    }

}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Hello!</title>
</head>
<body>
<html>
<head>
</head>
<body>

<?php
if(count($error) > 0) {
    echo 'Error !';
// или разбери весь массив с ошибками
} else {
    echo '';
}

?>
</body>
</html>

Автор: skyboy 1.9.2008, 15:56

M
skyboy
vitalina, неужель тяжко кликнуть по чекбоксу "транслит"?

Автор: vitalina 1.9.2008, 17:15
Po kakomu 4ekboksu
skyboy?


americanets, spasibo, vrode rabotaet!

Автор: americanets 1.9.2008, 17:28
Цитата(vitalina @  1.9.2008,  18:15 Найти цитируемый пост)
Po kakomu 4ekboksu


http://ipicture.ru/

Автор: lukas 1.9.2008, 17:39
на мой взгляд можно легко заставить чтобы header() работал где угодно, в любом месте, для этого нужно буферизировать вывод страницы..

Код

ob_start();
include('same.php'); // а в этом файли функция header где угодно, да любые функция которые нужно выполнять до вывода страницы
echo ob_get_contents();
ob_clean();

Автор: vitalina 1.9.2008, 19:48
lukas, так вобще содержимого файла не видно. Пусто.

Автор: lukas 1.9.2008, 21:04
vitalina, путь к файлу неверный... include не выводит ошибку если не найден файл...

Автор: vitalina 2.9.2008, 11:20
lukas, так вобще содержимого файла не видно. Пусто.

Добавлено через 2 минуты и 19 секунд
Почему не верный? а какой путь должен быть, полный? С http?

Автор: lukas 2.9.2008, 12:32
vitalina, 

Код

ob_start();
require($_SERVER['DOCUMENT_ROOT'].'/same.php'); // а в этом файли функция header где угодно, да любые функция которые нужно выполнять до вывода страницы
echo ob_get_contents();
ob_clean();

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