Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Повторная отправка данных из формы...

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот столкнулся с проблемлой, не знал как её в теме описать, так что модеры, не ругайтесь, пожалуйста =)
 
Вообщем есть скрипт....он обрабатывает результат из формы и коректирует потом БД(MySQL), так вот пример скрипта для вида делаю:
 
$sql = ("SELECT * FROM test");
$result=mysql_query($sql);
while($row = mysql_fetch_array($result))
{
$test=$row[test];
}
 
$test++;
 
 mysql_query("UPDATE test SET test='$test'");
 mysql_query("INSERT INTO test2 VALUES ('test')");
 
Это так, пример, что бы было видно о чём я говорю....так вот, если на странице с формой зажать энтер надолго, то в таблице test поле допустим увиличиться на 5, а в таблице test2 появиться записей больше.....т.е. что ли получается что скрипт запускается паралельно несколько раз, одновременно выдерает из БД значение теста потом пишет, но всёравно оба записываю в тест2 информацию.....
 
Подскажите, что делать, как это лечить?А то багов благодаря этому в скрипте море появилось!Раньше может внимания не обращал или не натыкался на это =(

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 00:12 12-05-2006 | Исправлено: MniD, 13:01 12-05-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MniD

Цитата:
Подскажите, что делать, как это лечить?А то багов благодаря этому в скрипте море появилось!Раньше может внимания не обращал или не натыкался на это =(

что лечить? руки?  
делай проверку на наличие уже существующей записи и тд и тп
Повторная отсылка данных. Как избавится??
PHP: предотвращение повторной передачи данных
PHP: переадресация при повторной отправке post-формы
и исправь название темы.
краткое решение - используй сессии.. получил данные - выставил, что уже получено и больше не обрабатываешь.


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:16 12-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
перечитай соопщение, я не про обновление страници и повторную передачу данных.......при переедресации багина останется 100%...

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 00:20 12-05-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MniD

Цитата:
я не про обновление страници и повторную передачу данных.......

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

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:23 12-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хм...почитал темки.....делать ереадресацию безсмысленно, проверку инфы, КАК?!!!!!!!Оно одновременно выдерает, time() совпадает, упдате изменяется один раз, а инфа добавляется несколько раз.....

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 00:30 12-05-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MniD
в начале скрипта ставишь переменную в сессии, что все, идет обработка..  
и проверяешь ее.


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:55 12-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Обьясни, пожалуйста, какую переменную в сессию записывать?!!!!

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 01:57 12-05-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MniD

Цитата:
Обьясни, пожалуйста, какую переменную в сессию записывать?!!!!

да какую хочешь...
<?
if(isset($_SESSION['running'])&&(time()-$_SESSION['running'])<5)  
{
echo "Уже выполняюсь";
}
else
{
$_SESSION['running']=time();
выполнение  нужного кода
}
?>
стоит ограничение, что очистка идет поле 5 секунд
 
ps: ты исправишь ошибку в названии темы или как?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:34 12-05-2006 | Исправлено: Cheery, 02:40 12-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
спасибо, вроде заработало =)

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 15:33 12-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Когда скрипт запускает один человек, работает хорошо.....
Но есть ещё скрипт который могут несколько человек одновременно обновить....и получается тоже самое....

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 04:55 15-05-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MniD

Цитата:
Когда скрипт запускает один человек, работает хорошо.....  
Но есть ещё скрипт который могут несколько человек одновременно обновить....и получается тоже самое....

несколько человек посылающие одно и то же?  
извини, но идея работы сайта как раз и заключается в работе с ним многих посетителей.
 
ps: продумай сначала алгоритм поведения скрипта.. что ты от него и как хочешь.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 04:57 15-05-2006 | Исправлено: Cheery, 04:58 15-05-2006
MniD



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Сорри что долго молчал, не до этого было....
 
Вообщем у всех всё разное, но в определённые момент у определённой группы пользователей одно и тоже надо сделать....
 
 
Ещё бывает допустим, что юзер1 подаёт запрос юзеру2, когда юзер2, делает запрос к юзеру1, то если юзер1 сделать запрос раньше, он записался в БД и юзер2 уже не записывает в БД что надо было, а реагирует на запись юзера1 из БД, но вот иногда бывает что юзер1 и юзер2 подают в один момент запрос....и что получается, оба ждут пока второй ответит, т.к. скрипт не среагировал на инфу из БД, т.к. на момент подачи запроса её там ещё не было....

Всего записей: 80 | Зарегистр. 23-02-2005 | Отправлено: 08:03 09-06-2006
Tiptop11

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня такая же проблема...
Не являюсь профессиональным программером, так что спрашивать не очень стыдно))))
 
Проблема:
Открывается сессия ----> заполняется и отсылается форма (формируется SQL-запрос) ----> SQL-запрос записывается в сессионную переменную и при обращении к странице "корзины" формируем таблицу товаров на основании SQL-запроса...
 
НО... при возвращении на страницу, на которой происходит формирование строки запроса, тыцкаем на Ф5 и запрос (чтоб его) дописывается старой строкой (отправляется еще раз)...  
 
Как этого избежать при использовании сессий?
 
Прошу помощи, а то я уже отчаялся((( мозги вскипают...

Всего записей: 3 | Зарегистр. 29-11-2007 | Отправлено: 00:39 20-01-2008
Vodmal



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tiptop11, ответ на твой вопрос выше дал Cheery. Редирект надо делать после отправки формы, тогда страница с POST-ом не сохраняется в истории браузера и при переходе назад она не появляется.
 
MniD, могу посоветовать использовать MetaForm, если проект не очень большой и не хочется сильно погружаться в эту тему.  В дополнение получишь еще несколько приятных вещей, например защита от CSRF, защита от некорректных данных в выпадающих списка.  
 
Пример с сессиями на самом деле только создает видимость работы. Данные в сессию записываются после того как скрипт отработал. Поэтому если он будет выполняться дольше чем сейчас и не успеет отработать до второго поста, то ты снова будешь получать несколько записей. Вставь sleep(10) куда-нибудь в код и ты в этом убедишься.  
 
Общего, красивого, гарантированного решения этой проблемы мне пока неизвестно.

----------
Скоро свадьба? Узнай как правильно фотографировать! Фотограф на свадьбу

Всего записей: 253 | Зарегистр. 03-09-2001 | Отправлено: 22:21 22-01-2008 | Исправлено: Vodmal, 22:25 22-01-2008
Ternik



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А есчо ребята есть такое понятие как транзакция. В частности =) УИУ!

Код:
 
//begin code...
BEGIN TRANSACTION
//...code
UPDATE 'table' SET var='value'
//...code
COMMIT
//...end code.
 

я полагаю что в MYSQL раз она не поддерживает вложенные запросы, можно юзать это как-то с mysql_pconnect. Но не судите, как вариант. Попробуйте, скажите =)

Всего записей: 763 | Зарегистр. 25-09-2002 | Отправлено: 04:12 23-01-2008
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Повторная отправка данных из формы...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru