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

Форум PHP

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

 

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

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

тема: Проблема с обновлением страницы с формой в FF.
 
 автор: Хулиган   (22.11.2007 в 08:49)   письмо автору
 
 

На странице есть форма, данные которой по submit добавляются в базу данных на сервере. После добавления данных в базу страница перезагружается.
Если после перезагрузки страницы нажать F5 (обновить страницу), то в базу данных добавляется ещё одна запись, аналогичная последней добавленной, т.к. в форме по прежнему содержатся данные от предыдущей загрузки формы. Как можно это предотвратить?

P.S.
В осле данного эффекта нет. После обновления страницы дублирования записей в базе данных не происходит, т.к. в осле форма после F5 не содержит никаких данных.

   
 
 автор: sim5   (22.11.2007 в 08:53)   письмо автору
 
   для: Хулиган   (22.11.2007 в 08:49)
 

Делать перенаправление на другую страницу после записи в базу:

<?
header
('location: file.php');

Или устанавливать какой либо флаг для проверки.

   
 
 автор: KPETuH   (22.11.2007 в 09:04)   письмо автору
 
   для: Хулиган   (22.11.2007 в 08:49)
 


<?
exit('<HTML><HEAD><META HTTP-EQUIV="REFRESH" CONTENT="0; URL='.$_SERVER['HTTP_REFERER'].'"></HEAD><BODY></BODY></HTML>');


смысл в том чтобы после записи в базу поставить exit в тексте которого содержется пренаправление назад или на любую другую страницу...

   
 
 автор: Alex Boxgorn   (22.11.2007 в 11:50)   письмо автору
 
   для: KPETuH   (22.11.2007 в 09:04)
 

так а состояние кнопки кто проверять будет? Вы же когда на кнопку давите вы получаете скрытую переменную в POST["type"] - вот и проверяйте ее наздоровье. Хоть 500 раз рефреш давите, а пока кнопку не надавите $type никогда не станет равна saveKart

<input type='hidden' name='type' value='saveKart'>

   
 
 автор: KPETuH   (22.11.2007 в 12:33)   письмо автору
 
   для: Alex Boxgorn   (22.11.2007 в 11:50)
 

не могу сказать точно, но помоему это не выход :) при рефреше скорее всего будет отправлятся ваше скрытое поле :)

   
 
 автор: Alex Boxgorn   (22.11.2007 в 12:42)   письмо автору
 
   для: KPETuH   (22.11.2007 в 12:33)
 

с каких шишов оно отправляться будет? эти переменные передаются по методу POST. А отправка осуществляется только при нажатии кнопки с type=submit

echo $_POST["type"] // при нажатии рефреш вы ничего не получите в этой переменной, а при нажатии на кнопку $_POST["type"]  будет равен 'saveKart'
<input type='hidden' name='type' value='saveKart'>
      <input type='submit' name='submit' value='Сохранить изменения' class='button'>

только после операций проводимых вами при нажатии кнопки не забудьте для страховки, если так хотите, удалить переменную.

   
 
 автор: KPETuH   (22.11.2007 в 12:45)   письмо автору
 
   для: Alex Boxgorn   (22.11.2007 в 12:42)
 

при рефреше происходит повторнаая передача данных, замечено на некоторых браузерах, поэтому и придумана конструкция предложенная мною...

   
 
 автор: Хулиган   (22.11.2007 в 14:05)   письмо автору
 
   для: Alex Boxgorn   (22.11.2007 в 12:42)
 

К сожалению, ни один из предложеных способов не работает
На форме есть input, который изначально пустой, а по нажатию кнопок в форме в него прописывается либо 'save', либо 'add'.
Но при рефреше этот input не пустой, а содержит значение, которое в него было записано при предыдущем submit'е...
Поэтому проверка скрытого input лишена смысла: он никогда не бывает пустым при обновлении страницы.
Способ с exit не работает возможно по причине того, что скрипт, добавляющий данные в базу, находится в том же файле, что и html-код страницы с формой.

В общем файл editnews.php выглядит так:

<?
    
if(isset($_POST['action'])) {
        
$link mysql_connect("localhost""user""pass") or die ("Could not connect");
        
mysql_select_db ("base") or die ("Could not select database");
        
mysql_query("SET NAMES cp1251");
        if (
$_POST['action'] == "save"){
            
$i=1;
            while (isset(
$_POST["message".$i] )){
                
$message trim($_POST["message".$i]);
                
$prevmessage $_POST["prevmessage".$i];
                if (
!= strlen($message)){
                    
//update news
                    
mysql_query("UPDATE `news` SET content = '$message' WHERE content = '$prevmessage'");
                }
                else{
                    
//delete news
                    
mysql_query("DELETE FROM `news` WHERE content = '$prevmessage'");
                }
                
$i++;
            }
        }
        else if (
$_POST['action'] == "add"){
            if (isset(
$_POST["newmessage"] )){
                
$newmessage trim($_POST["newmessage"]);
                
$added "NOW()";
                if (
0!=strlen($newmessage)){
                    
$sql_str "INSERT INTO `news` VALUES (";
                    
$sql_str.= $added,";
                    
$sql_str.= " '$newmessage',";
                    
$sql_str.= " '')";
                    
$result mysql_query($sql_str);
                }
            }
        }
        
mysql_close($link);
        
//exit('<HTML><HEAD><META HTTP-EQUIV="REFRESH" CONTENT="0; URL='.$_SERVER['HTTP_REFERER'].'"></HEAD><BODY></BODY></HTML>');
    
}
?>

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <title></title>
</head>

<body>
    .....
    .....    
    <form name=frm_edit action=editnews.php method=post>
        .....
        <input type=hidden  name='action' id='action' value=''>
        <input type=button  value='                   ' onclick="send_edit()">
        <input type=button  value='                ' onclick="send_add()">
    </form>
    .....
    .....
</body>

<script type="text/javascript" language="javascript">
    function send_edit(){
            document.getElementById('action').value = "save";
            document.forms['frm_edit'].submit();
    }
    function send_add(){
            document.getElementById('action').value = "add";
          document.forms['frm_edit'].submit();
    }
</script>
</html>

   
 
 автор: KPETuH   (22.11.2007 в 14:11)   письмо автору
 
   для: Хулиган   (22.11.2007 в 14:05)
 

поробуйте использовать разные форму на каждую кнопку и не использоватья яваскрипт в данным образом...

   
 
 автор: sim5   (22.11.2007 в 14:22)   письмо автору
 
   для: Хулиган   (22.11.2007 в 14:05)
 

Что-то не верится, что не работает:

<?
mysql_close
($link); 
header('location: path/file.php'); 

и никакие F5 не сработают уже.

   
 
 автор: Хулиган   (22.11.2007 в 17:03)   письмо автору
 
   для: sim5   (22.11.2007 в 14:22)
 

header('location: /editnews.php'); я пробовал первым делом, ещё до того, как задать свой вопрос, но этот способ даёт ошибку:
Cannot modify header information - headers already sent by (output started at z:\home\site..ru\www\editnews.php:2) in z:\home\site.ru\www\editnews.php on line 38.

Видимо придётся разнести форму и скрипт по её обработки в разные файлы...

Спасибо всем.

   
 
 автор: sim5   (22.11.2007 в 17:21)   письмо автору
 
   для: Хулиган   (22.11.2007 в 17:03)
 

Про это Cannot modify header information - headers already sent by... уже столько раз говорилось, что ей богу вам должно быть просто стыдно. Это не header('location: /editnews.php'); не работает, это у вас перед пердачей заголовка, есть вывод в браузер!

   
 
 автор: Хулиган   (22.11.2007 в 17:43)   письмо автору
 
   для: sim5   (22.11.2007 в 17:21)
 

Мне не стыдно. Я знаю, что нельзя ничего выводить до передачи заголовка. И нечего не вывожу в браузер. Весь код до header(location) приведен выше без каких-либо сокращений. И там нет вывода в браузер.

   
 
 автор: sim5   (22.11.2007 в 17:49)   письмо автору
 
   для: Хулиган   (22.11.2007 в 17:43)
 

Если бы не было, то вы бы получили это сообщение только в том случае, если перед ним получили либо замечание или ошибку, например, при записи в базу. Но вы об этом не упоминаете, значит у вас где-то пустая строка, или перед тегом РНР есть пустая строка, а достаточно и одного пробела. Проверьте еще раз.

   
 
 автор: Хулиган   (22.11.2007 в 18:17)   письмо автору
 
   для: sim5   (22.11.2007 в 17:21)
 

Посыпаю голову пеплом :(((
Оказывается, пустая строка, в которой нет абсолютно ничего, воспринимается как вывод в браузер...
Пустая строка была оставлена для удобства чтения кода, а оказалось, что она воспринимается как вывод в браузер и мой header('location') по этой причине не работал.
Ещё раз всем спасибо. Проблема решена. Форма больше не содержит прежних данных при обновлении через header('location')

   
Rambler's Top100
вверх

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