Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Борьба с повторной отправкой формы   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2007-07-22 14:21) [0]

Нужен совет. Имеется HTML-форма, информация из которой отправляется PHP-скрипту. PHP-скрипт должен проверить, нет ли в соответствующей таблице БД (MySQL) записи с теми же значениями, что и переданные из формы. Если такой записи не найдено, она создаётся.

Вопрос в следующем. Наверное, ни для кого не секрет, что если отправка формы производится не щелчком мыши, а нажатием кнопки Enter, то эта самая отправка может произойти несколько раз. В моём случае тоже почему-то добавляется несколько одинаковых записей, хотя проверка присутствует.

Искал в справочниках функцию, которая бы выполняла действия аналогичные fflush(), но с базами данных. Не нашёл.

Подскажите, что можно сделать в моём случае.

P.S. Собственно, код проверяющей функции.

function ItemExists($ItemID)
{
$Result=True;
$BD=LogToDB();
$Res=MySQL_Query("SELECT *
                  FROM Items
                  WHERE ItemID="".$ItemID.""",$BD);
if (@MySQL_Num_Rows($Res)==0) $Result=False;
@MySQL_Free_Result($Res);
MySQL_Close($BD);
return $Result;
}

P.P.S. LogToDB() - это функция, которая присоединяется к моей БД и настраивает работу в нужной кодировке; к ней никаких претензий нет.

P.P.P.S. Пробовал по-всякому модифицировать функцию ItemExists(), но ничего не даёт: если нажать и удерживать Enter хотя бы некоторое время, появляется штук 5 одинаковых записей.


 
Yanis ©   (2007-07-22 14:23) [1]

Вопрос дельфиста: а если кнопку сделать недоступной после нажатия?


 
ProgRAMmer Dimonych ©   (2007-07-22 14:34) [2]

> Yanis ©   (22.07.07 14:23) [1]
> Вопрос дельфиста: а если кнопку сделать недоступной после
> нажатия?

Ответ не меньшего Delphiста: не хотелось бы. Это требует использования JavaScript, а желательно обойись без него.

Было подозрение, что MySQL просто не сбрасывает кэш и каким-то боком возвращает PHP-скрипту неправильную информацию о количество записей по запросу SELECT, но по логике при вызове MySQL_Close() весь кэш должен сбрасываться.


 
ProgRAMmer Dimonych ©   (2007-07-22 14:35) [3]

P.S. Плюс ко всему очень часто приходилось сталкиваться с такой картиной: броузер поставлен в offline-режим, текст набран. Жмём кнопку отправки... Она становится недоступна, а отправка не произошла. Приходится спасать продукты умственной деятельности, излитые в форму.


 
Kostafey ©   (2007-07-22 17:11) [4]

Вообще, выглядит странно.

Кстати, возникает сразу вопрос.
Зачем нужно подключаться и отключаться от БД при каждом обращении ?

Ладно, а если без проверки просто запись добавлять все проходит корректно ?


 
Zeqfreed ©   (2007-07-22 18:30) [5]

Почему просто не создать уникальный индекс (или как он там называется?), чтобы повторные записи просто не вставлялись в БД, возвращая соответствующую ошибку (1062 в MySQL).


 
БарЛог ©   (2007-07-22 18:44) [6]

if (mysql_fetch_array($res)) ...
или, если ругнётся, if ($aaa = mysql_fetch_array($res)) ...

(пишу в блокноте)


 
wicked ©   (2007-07-22 19:21) [7]

еще идеи:
1) не давать отправить форму чаще раза за X времени (как бонус - защита от зафлуживания)
опираться при проверках на поле таймстамп вставки/обновления записи, которое нужно еще завести
особенности реализации - ЕМНИП, разрешающая способность timestamp-ов в mysql - около секунды, что может затруднить юзерам жизнь, если несколько из них одновременно запостят данные на одну и ту же id

2) писать в форму, в hidden поле, уникальное случайное число и при посте формы прверять, были ли уже запощены данные с таким числом
если были - пост игнорировать


 
ProgRAMmer Dimonych ©   (2007-07-22 20:01) [8]

> Kostafey ©   (22.07.07 17:11) [4]
> Вообще, выглядит странно.
> Кстати, возникает сразу вопрос.
> Зачем нужно подключаться и отключаться от БД при каждом
> обращении ?

Это так, мелочь. Идея передавать функции идентификаторсоединения с БД была и есть, а в ближайшее время будет использована уже на практике.

> Ладно, а если без проверки просто запись добавлять все проходит
> корректно ?

Проблема не в том, что не пишет. Проблема в том, что пишет слишком много.

> Zeqfreed ©   (22.07.07 18:30) [5]
> Почему просто не создать уникальный индекс (или как он там
> называется?), чтобы повторные записи просто не вставлялись
> в БД, возвращая соответствующую ошибку (1062 в MySQL).

Интересная идея. Надо копнуть в эту сторону: может быть, так даже проще будет.

> БарЛог ©   (22.07.07 18:44) [6]
> if (mysql_fetch_array($res)) ...
> или, если ругнётся, if ($aaa = mysql_fetch_array($res))
> ...
> (пишу в блокноте)

Получать записи, соответствующи запросу я умею :)

> wicked ©   (22.07.07 19:21) [7]
> еще идеи:
> 1) не давать отправить форму чаще раза за X времени (как
> бонус - защита от зафлуживания)
> опираться при проверках на поле таймстамп вставки/обновления
> записи, которое нужно еще завести
> особенности реализации - ЕМНИП, разрешающая способность
> timestamp-ов в mysql - около секунды, что может затруднить
> юзерам жизнь, если несколько из них одновременно запостят
> данные на одну и ту же id

Идея была, но именно относительно сложная реализация (пару часиков придётся повозиться, наверное) стала причиной того, что я от неё отказался.

> 2) писать в форму, в hidden поле, уникальное случайное число
> и при посте формы прверять, были ли уже запощены данные
> с таким числом
> если были - пост игнорировать

А вот это, кстати, идея. Если выяснится, что MySQL не решает проблему "уникальными индексами" (сам не силён в терминологии, просто видел такое), то вариант, когда одной отправленной странице ставится в соответствие одна возвращённая форма (хм, сложно получилось :)), вполне сойдёт.



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
4-1172653785
Сергей М.
2007-02-28 12:09
2007.08.19
Печать принт-задания в *.prn-файл


15-1184906287
vasIZmax
2007-07-20 08:38
2007.08.19
Тестирование приложения


15-1185008215
DillerXX
2007-07-21 12:56
2007.08.19
Знатокам футбола


3-1177999034
Nemec
2007-05-01 09:57
2007.08.19
TService и доступ к базе данных


8-1163353953
Anton1986
2006-11-12 20:52
2007.08.19
Дата в jpeg