Форум: "Прочее";
Текущий архив: 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.48 MB
Время: 0.042 c