Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
15-1184906287
vasIZmax
2007-07-20 08:38
2007.08.19
Тестирование приложения


3-1177566685
MZ
2007-04-26 09:51
2007.08.19
узнать количество суток между двумя датами в FireBird


15-1184648259
vajo
2007-07-17 08:57
2007.08.19
DVD-RW перестал читать не DVD диски


2-1184858946
Kyro
2007-07-19 19:29
2007.08.19
Можно ли замкнуть дбгрид


15-1184790822
Kerk
2007-07-19 00:33
2007.08.19
Смотрел женский футбол





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский