目前我有一个应用程序,当用户单击提交按钮时,它将触发insert
代码以插入reports
函数的记录。
我现在面临的问题是,用户不是精通计算机,因此我从表中得到的数据不准确。以下是导致数据捕获错误的几个示例。
案例1:用户点击提交按钮后,数据已insert
到数据库但用户不小心再次点击提交按钮,再次点击insert
触发器并导致数据库有两个相同的记录,不同的时间戳在5到10秒左右。
案例2:第一个记录用户输入实际上不是用户想要的,例如,用户想要键入29/10/2013
但是用户键入为28/10/2013
并且用户再次点击后退按钮并插入正确的29/10/2013
和一个事务,它有2个记录,其中一个是正确的日期,一个是错误的日期。
以下是代码:
$stmt = $db->prepare("INSERT INTO log (dob, log_datetime, log_count, amount) VALUES (?, ?, ?, ?)");
$stmt->bindParam(1, $userDate);
$stmt->bindParam(2, $now, PDO::PARAM_STR);
$stmt->bindParam(3, $cust_count);
$stmt->bindParam(4, $amount);
date_default_timezone_set('Asia/Kuala_Lumpur');
$now = date('Y-m-d H:i:s');
$cust_count = 1;
$amount = 10;
$stmt->execute();
只要用户点击提交按钮,上面的代码就会触发,所以我想有可能在一段时间后触发insert
代码,例如30sec
?
附加说明
insert
查询 我搜索SO和Google,但找不到相关的示例。
请建议我解决上述两种情况的方法。
谢谢。
答案 0 :(得分:1)
对于第一种情况,请在提交表单时禁用该按钮。 对于第二种情况,validate数据在插入数据库之前。
答案 1 :(得分:0)
答案 2 :(得分:0)
MySQL没有这种行为。我认为您正在寻找的是异步任务队列,如Celery
答案 3 :(得分:0)
尝试捕获所有UI泄漏可能会很困难和麻烦。
我宁愿使用DB中的时间戳作为时间过滤器
我会使用cust_count作为候选键来查询最近的记录(在过去30秒内),并更新最后一条记录(如果有的话),而不是重新创建它。
示意图:
function update_log ($entry)
{
$recent = $db->select (
"id FROM log
WHERE timestamp > now()-30 seconds
AND user = $entry->user");
if ($recent)
{
// overwrite last record with current entry (and refresh timestamp)
}
else
{
// create a new entry
}
}
您甚至可以删除用户添加30秒以内的条目的所有日志。
答案 4 :(得分:0)
在提交时禁用提交按钮,并在提交后的页面上向用户显示提交的数据,并为他们提供清晰的编辑方式。
用户通常怀疑回复表单不是一个好主意,但你没有给他们任何更好的选择。