php插入数据一段时间后

时间:2014-01-25 17:55:56

标签: php mysql pdo

目前我有一个应用程序,当用户单击提交按钮时,它将触发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

附加说明

  1. 这是一个从表中开发并执行数据库的应用程序
  2. 它与表单验证无关,因为我已经编写了表单验证部分。
  3. 我的问题是有没有办法在特定的时间设置上触发insert查询
  4. 我搜索SO和Google,但找不到相关的示例。

    请建议我解决上述两种情况的方法。

    谢谢。

5 个答案:

答案 0 :(得分:1)

对于第一种情况,请在提交表单时禁用该按钮。 对于第二种情况,validate数据在插入数据库之前。

答案 1 :(得分:0)

http://us3.php.net/sleep

  

睡眠(30);

     

$ stmt->执行();

会做你想要的我相信。

答案 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)

在提交时禁用提交按钮,并在提交后的页面上向用户显示提交的数据,并为他们提供清晰的编辑方式。

用户通常怀疑回复表单不是一个好主意,但你没有给他们任何更好的选择。