Copy link to clipboard
Copied
I have a form that submits to a database.
Sometimes users inadvertanly click the submit button 2 or 3 times, resulting in 2 or 3 dupkicate submissions.
I would like to stop users from being able to insert any record within 5 seconds of the last insert
<cfquery datasource="#APPLICATION.ds#" name="get_max_ID">
SELECT MAX(insert_time) AS maxtime FROM FORMS
</cfquery>
When a form is submitted I need to check if it is within 5 seconds of the maxtime .
If it is . I <cfabort> with an error message.
If it is after 5 seconds I allow the insert.
How do I do this check?
Are you envisioning a db solution? I'd recommend against it. It just doesn't feel like the right way to go. (Maybe you didn't mean that. Just clarifying.)
Are you envisioning instead a coldfusion solution? That would be possible, using some way to track the time of each submissions for each user, which could be tracked via sessions, cookies, a database, or even in the application scope (tracking each user there, somehow). It would then just be a matter of using the CF datediff function to comp
...Copy link to clipboard
Copied
Are you envisioning a db solution? I'd recommend against it. It just doesn't feel like the right way to go. (Maybe you didn't mean that. Just clarifying.)
Are you envisioning instead a coldfusion solution? That would be possible, using some way to track the time of each submissions for each user, which could be tracked via sessions, cookies, a database, or even in the application scope (tracking each user there, somehow). It would then just be a matter of using the CF datediff function to compare the saved time of the last submission to now().
But finally this is a kind of problem often solved instead on the client end, using Javascript. Here again there are multiple such solutions (including the simplistic cfinput type="submit" validate="submitonce".) And of course, developers well beyond cf seek such client-side solutions, which widens the range of options you might find.
I realize you may say you'll take any solution that "works", and in that case you may just want to "see some code" for it. But before I or others might offer that, I wanted to put these options out there as a first response, to see if you may point to a preference of one direction vs another.
Copy link to clipboard
Copied
Thank you Charlie. I was hoping to use CF code for a solution.
Copy link to clipboard
Copied
So you'll be using one of the several cf solutions I posed? Will you take those ideas and run with one?
Or are you wanting someone else to write the code? I'm not aware of any that exists, that I can just point to.
Copy link to clipboard
Copied
I'm having the same issues in our application and am brainstorming a plan for this. We have to dedupe these items a few times per day.
I agree with Charlie about not implementing this at the database layer. What I'm considering is locking the button and showing a "Please wait..." modal dialog over the page with a small animated gif with javascript that fires when the "submit" "onClick" action is performed. Something similar to, but not necessarily this.. (found it on a quick giphy search)
Then we either wait a set amount of time to disappear, wait for the page to load on the next step after the query finishes to disable it, or find a way to get a callback from the database that the record was written to disable the modal overlay and move the page along to the next step.