Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 13:10   #1
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
Стрелка Избежать повторного добавления записи

Здравствуйте!

У меня проблема с повторным добавлением записи. На странице строится форма, в которой есть скрытое поле "c_un" со значением 1. В начале страницы проверяется содержит ли элемент $_POST['c_un'] значение 1 и если да, то создается запись. В процедуре создания записи последняя строка присваивает этому элементу значение 0.

В начале всего кода я проверяю какое значение имеет этот элемент массива POST. А оно всегда остается равным 1. Хотя форма уже не строится, просто выполняется запись. А по F5 ... создается такая же запись Пробывал unset() на весь массив - не помогло.

Не подскажете как профессионально организуется механизм "избегания" повторного добавления? Как обнулить POST и все вернуть к изначальному состоянию?
alt5000 вне форума Ответить с цитированием
Старый 03.01.2012, 15:46   #2
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Ничего не понял, какие записи, куда? Повторного добавления чего, куда?
Давайте код ... но по-моему здесь уже изначально какой-то бредовый алгоритм
Cronos20 вне форума Ответить с цитированием
Старый 03.01.2012, 16:13   #3
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
По умолчанию

Конечный фрагмент процедуры записи
PHP код:
    $link mysql_connect($host$user$pswd) or die ("Can't connect to database");
    
mysql_select_db($database$link) or die ("Can't select DB");
    
$query "INSERT INTO `units` (`l_name`, `s_name`, `comm`) VALUES ('$full_name', '$sh_name', '$comm')" or die ("Can't");
    
$result mysql_query($query$link);

echo(
"<font color=Darkgreen><br>Новая единица измерения <b>успешно создана</b></font><br><br>");
$_POST['c_un']='0';
normal_view(0); 
Фрагмент обработки условий

PHP код:
if ($_POST['c_un']=='1')
{

    
create_un($_POST[name], $_POST[sh_name], $_POST[comment]);
    exit;

Вроде все понятно
alt5000 вне форума Ответить с цитированием
Старый 03.01.2012, 16:16   #4
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
По умолчанию

Цитата:
Сообщение от alt5000 Посмотреть сообщение
Здравствуйте!

У меня проблема с повторным добавлением записи. На странице строится форма, в которой есть скрытое поле "c_un" со значением 1. В начале страницы проверяется содержит ли элемент $_POST['c_un'] значение 1 и если да, то создается запись. В процедуре создания записи последняя строка присваивает этому элементу значение 0.

В начале всего кода я проверяю какое значение имеет этот элемент массива POST. А оно всегда остается равным 1. Хотя форма уже не строится, просто выполняется запись. А по F5 ... создается такая же запись Пробывал unset() на весь массив - не помогло.

Не подскажете как профессионально организуется механизм "избегания" повторного добавления? Как обнулить POST и все вернуть к изначальному состоянию?
Извините, а что здесь непонятного-то. Все вроде по-русски
alt5000 вне форума Ответить с цитированием
Старый 03.01.2012, 16:28   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Браузер кеширует данные суперглобальных массивов.
Это необходимо для корректного отображения ранее посещённых страниц при использовании кнопок "вперед"-"назад" в браузере.

Соответственно - при использовании кнопки "обновить"(или F5) - браузер ещё раз отправляет данные из формы.
Некоторые браузеры даже выдают предупреждения об этом при возвратах или обновлениях страниц(Firefox, Chrome):

Изменить эти данные в кэше браузера можно только повторно отправив форму с новыми значениями (бесполезно пытаться изменить эти данные внутри скрипта - эти изменения не повлияют на кэш браузера).

Простейший способ избавиться от этой проблемы - осуществить принудительный редирект страницы(после обработки данных формы) из самого скрипта средствами:
PHP - функция header();
JS - команда document.location.href="_адрес_";

В этом случае кэш браузера будет очищен.
Andkorol вне форума Ответить с цитированием
Старый 03.01.2012, 17:14   #6
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Браузер кеширует данные суперглобальных массивов.
Это необходимо для корректного отображения ранее посещённых страниц при использовании кнопок "вперед"-"назад" в браузере.

Соответственно - при использовании кнопки "обновить"(или F5) - браузер ещё раз отправляет данные из формы.
Некоторые браузеры даже выдают предупреждения об этом при возвратах или обновлениях страниц(Firefox, Chrome):

Изменить эти данные в кэше браузера можно только повторно отправив форму с новыми значениями (бесполезно пытаться изменить эти данные внутри скрипта - эти изменения не повлияют на кэш браузера).

Простейший способ избавиться от этой проблемы - осуществить принудительный редирект страницы(после обработки данных формы) из самого скрипта средствами:
PHP - функция header();
JS - команда document.location.href="_адрес_";

В этом случае кэш браузера будет очищен.
О, вот это по делу, а не раздраженная болтовня как у предыдущего участника. Насчет редиректа я понял, но у меня на странице после процедуры записи выдается сообщение об ее успешном выполнении. То есть мне надо сделать редирект не на основную страницу, а скажем на page.php?r=success, где и выводить сообщение (по условию r==success). Или как-то по другому это будет правильно организовать?
alt5000 вне форума Ответить с цитированием
Старый 03.01.2012, 17:25   #7
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от alt5000 Посмотреть сообщение
То есть мне надо сделать редирект не на основную страницу, а скажем на page.php?r=success, где и выводить сообщение (по условию r==success). Или как-то по другому это будет правильно организовать?
А сразу на основную страницу с ?r=success - никак нельзя..?
Можно в сессии флаг поставить - и с его помощью сообщать о результатах.
Andkorol вне форума Ответить с цитированием
Старый 03.01.2012, 17:54   #8
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
А сразу на основную страницу с ?r=success - никак нельзя..?
Можно в сессии флаг поставить - и с его помощью сообщать о результатах.
Да,я и имел ввиду эту же страницу с передачей параметров. А флаг в сессии - Вы имеете ввиду элемент массива SESSION?
alt5000 вне форума Ответить с цитированием
Старый 03.01.2012, 18:01   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от alt5000 Посмотреть сообщение
А флаг в сессии - Вы имеете ввиду элемент массива SESSION?
Да, $_SESSION.
Andkorol вне форума Ответить с цитированием
Старый 03.01.2012, 18:42   #10
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
По умолчанию

Спасибо, Вы мне очень помогли
alt5000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отловить события добавления записи в таблицу SolidSnake БД в Delphi 5 05.11.2011 19:46
Задержка добавления записи в базу Access из Dephi Zver БД в Delphi 11 16.05.2011 17:57
Триггер , который после добавления записи в одну таблицу редактирует запись другой таблицы Rin БД в Delphi 7 18.12.2010 03:50
Узнать ID (автоинкримент) до добавления записи Droid БД в Delphi 3 09.04.2010 09:52
Избежать повторного нажатия на кнопку Shouldercannon Общие вопросы Delphi 4 27.04.2009 11:26