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


Автор: studentigor 1.9.2011, 19:15
Всем привет.
Есть форма для комментария. 
Всего одно поле textarea и кнопка.

Так вот, при нажатии на кнопку все записует, все ок. Но нажимаю F5 и снова записуется, и снова и снова.

Я сделал редирект через хедер, но ничего не помогает. Как можно решить эту проблемку.
Вот код где идет редирект
Код

.........
$rs = mysql_query($sq);
        header('Location:news.php?i='.$_GET['i'].'&pg='.$_GET['pg']);


может это просто в мазиле такая хрень. 
Пробовал джаваскриптом чистить форму - она пустая. пробовал делать unset($_POST) - ноль реакции.
Спасибо

Автор: kovaldm 1.9.2011, 19:28
А у тебя header точно срабатывает? Мож вывод какой-нибудь есть до него или BOM?

Автор: studentigor 1.9.2011, 19:37
Хедер, если до его есть вывод - не работает.
Я менял местами $_GET данные и перенаправило правильно, но вот это всеравно срабатывает
Код

if($_POST['action']=='save'){
    $tmp_dt = explode(' ',microtime());
    if($_POST['text_com'] !== ''){
        $sq = "INSERT INTO `coments` (`user_id`,`news_id`,`com_text`,`data_c`) VALUES
            ('".$_SESSION['user_id']."','".$_GET['i']."','".$_POST['text_com']."','$tmp_dt[1]')";
        $rs = mysql_query($sq);
        header('Location:news.php?i='.$_GET['i'].'&pg='.$_GET['pg']);
    }
}

перед этим подключается сессия и файл с настройками бд

Автор: kovaldm 1.9.2011, 19:43
Не понял, после перенаправления нажатие F5 все равно отправляет данные серверу?

Вместо microtime() и explode() можно использовть time().

Автор: studentigor 1.9.2011, 19:54
да. сколько раз нажимаю f5 столько и записуется в базу, хотя по идее не должно.


Автор: kovaldm 1.9.2011, 20:11
Попробуй включи буферизацию первой строчкой в индексе.

Автор: MoLeX 2.9.2011, 07:36
после header надо ставить exit();

Автор: Gold Dragon 2.9.2011, 08:10
а может просто поставить "маячок"? Например, записать в сессию номер записи после первого сохранения. А перед записью в базу проверять существование ID, а если есть, то существование его уже в самой базе.. Тогда ты избежишь перезаписи в базу..

Очень простая, но действующая защита от дураков... smile

А ещё можно воспользоваться не INSERT, а REPLACE

Автор: Absinthe 2.9.2011, 13:24
Цитата

а может просто поставить "маячок"?
 Проще? Проще чем примитивный и отлично работающий редирект?

Автор: Gold Dragon 2.9.2011, 13:34
Absinthe, ещё есть кнопка НАЗАД у браузеров. Это тоже самое что F5 будет

Автор: Smorodin 2.9.2011, 17:05
Так после хедера стоит или нет exit()? Если стоит, то все равно заново отправляет?

Автор: Gold Dragon 3.9.2011, 16:35
Цитата(Absinthe @  2.9.2011,  16:37 Найти цитируемый пост)
 И что? 
да то что запрос будет отправлен повторно

Автор: Absinthe 3.9.2011, 16:38
Цитата

да то что запрос будет отправлен повторно
 С чего бы, если есть редирект?

Автор: MoLeX 3.9.2011, 17:52
по всей видимости у тс редирект не проходит

Автор: capitan 4.9.2011, 00:24
Поясните пожалуйста как возможно одновременное использование $_GET и $_POST ? Это  не возможно. Вы уж определитесь как происходит передача данных.
Код

if($_POST['action']=='save'){
    $tmp_dt = explode(' ',microtime());
    if($_POST['text_com'] !== ''){
        $sq = "INSERT INTO `coments` (`user_id`,`news_id`,`com_text`,`data_c`) VALUES
            ('".$_SESSION['user_id']."','".$_GET['i']."','".$_POST['text_com']."','$tmp_dt[1]')";
        $rs = mysql_query($sq);
        header('Location:news.php?i='.$_GET['i'].'&pg='.$_GET['pg']);
    }
}

Автор: MoLeX 4.9.2011, 05:17
capitan, я отвечу тебе
Код

<form action="http://site/script.php?param1=value1&param2=value2" method="post">

Автор: capitan 4.9.2011, 12:20
Цитата(MoLeX @ 4.9.2011,  05:17)
capitan, я отвечу тебе
Код

<form action="http://site/script.php?param1=value1&param2=value2" method="post">

Это понятно, но это совершенно не правильно. Или используй глобальный массив $_GET или $_POST.  Существуют же какие-то нормы. Я бы понял, если бы использовался $_REQUEST. 
Это что за запись?
Код

if($_POST['text_com'] !== ''){ 
...
}


проверка переменной делается или через isset или через empty
Код

if(!empty($_POST['text_com'])) {
....
}

К чему я все это. К тому, что код нужно писать так, чтобы другой программист в нем быстро разобрался, а не посылал в вашу сторону лучи поноса за быдло-код.

Автор: MoLeX 4.9.2011, 13:44
Цитата(capitan @  4.9.2011,  12:20 Найти цитируемый пост)
Это понятно, но это совершенно не правильно. Или используй глобальный массив $_GET или $_POST

почему? ткни носом в доку где это написано.

по этой логике надо использовать или куки или гет? так получается

Автор: Absinthe 4.9.2011, 14:06
Цитата

 Существуют же какие-то нормы.
 Приведи ссылку на норму из RFC 2068.

Автор: capitan 4.9.2011, 16:26
Спорить не буду, чтобы не засорять тему. Останусь при своем мнении. 
Вот эта строчка должна выдавать "Notice: Undefined index: action", но ТС про это не говорит.
Код

if($_POST['action']=='save')

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