等待30秒以便在PHP和MySQL上进行新操作?

时间:2010-05-27 19:12:07

标签: php mysql

在我的网页中,用户填写了一个将信息发送到MySql数据库的表单。发送的数据输入之一是日期/时间,格式为date('l jS \of F Y h:i:s A'); (我可以根据需要更改格式)

因此,当用户提交表单时,我想检查实际时间/日期是否比发送的时间/日期多30秒,以便允许或不允许提交表单。谢谢!

5 个答案:

答案 0 :(得分:6)

所以你有类似......

<form action="wtv.php" method="POST">
    <input type="hidden" name="date" value="<?php echo date('l jS \of F Y h:i:s A'); ?>" />
    <input type="submit" />
</form>

...当用户点击“提交”时,您想检查“日期”输入的值是否小于30秒之前?

你可以用Ken Keenan建议的方式做到这一点......但问题是你不能相信客户输入。在您对jeroen的回答的评论中,您表明了一种意识到客户端脚本是不值得信任的,但这不仅限于脚本;如果你真的需要这个是安全的,那么在请求<form>后30秒内没有人可以提交此表单,你必须做其他事情。

问题在于服务器对“日期”输入的期望是可预测的;如果我访问您的<form>并打开Firebug或甚至保存HTML文档并在记事本中打开它,我可以非常轻松地猜测如何更新<input />以便我可以提交。

而是使用令牌。

随机生成一种唯一的随机ID并将其存储在会话或数据库中......

$unique = md5(uniqid()).md5(time()); // there are better ways to get a unique random ID
$_SESSION['tokens'][$unique] = time();

然后在<form> ...

中加入令牌(不是日期/时间!)
<form action="wtv.php" method="POST">
    <input type="hidden" name="token" value="<?php echo htmlentities($unique); ?>" />
    <input type="submit" />
</form>

...并在提交时检查该令牌的时间是否少于30秒。

<?php
    // partially borrowed from Ken Keenan's answer...
    if((time() - $_SESSION['tokens'][$_POST['token']]) > 30) {
        echo "Time's up!";
    } 
?>

答案 1 :(得分:2)

您可以将提交时间存储在会话变量中(无论您自己的日期格式如何,只需将time()的结果存储在您的服务器上),并在对提交操作采取任何操作之前检查该变量是否已设置。

如果您想在浏览器端禁止提交,则需要使用javascript。

示例(为了清晰起见,过于冗长):

<?php
    session_start();

    if (isset($_SESSION['submit_time']))
    {
         if ($_SESSION['submit_time'] >= (time() - 30))
         {
             die();
         }
    }
    $_SESSION['submit_time'] = time();
?>

答案 2 :(得分:1)

如果我理解正确,您希望在30秒后创建一个“过期”的表单吗?

我会在表单中创建一个隐藏元素:

<input name="current_time" type="hidden" value="<?php echo time(); ?>"

然后,您可以在提交表单时进行检查:

<?php
if((time() - $_POST['current_time']) > 30) {
  echo "Time's up!";
} 
?>

您也可以在客户端上使用JavaScript来检查表单提交 - 但这取决于客户端的时钟与服务器相比大致正确...

答案 3 :(得分:1)

如果您坚持存储日期时间的文本版本,我建议您还存储日期时间的日期时间版本。然后比较很容易。

如果没有javascript,提交仍然会发生,但如果您的处理脚本使用UPDATE查询,例如

UPDATE mytable SET wordydatetime='$dayofmonthyearhourminutesecond' 
WHERE realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS) AND record_id=$x;

如果更新太快,则更新将失败。

ETA:

如果您要进行更复杂的处理而不仅仅是更新,快速SELECT将让您确定是否继续处理表单:

SELECT record_id FROM mytable 
  WHERE record_id=$x 
    AND realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS);

如果您没有回复记录,则表示不应处理该表单。

答案 4 :(得分:0)

您可以通过让您的mysql日期为unix_time来轻松完成此操作。然后你会用mktime()做一个插入语句。

这是迄今为止最容易检查是否在30秒内完成,因为unix时间是第二次计数。所以只需做一个数字比较,mktime()在post,mktime()在2nd post,减去,如果结果是&gt; 30,做你需要的任何事情。

示例:(根据要求)

对数据库进行初始INSERT,对于表中的DATE / TIME值,使用mktime()的结果

如果用户尝试再次发帖,请检查帖子是否存在(或最后一个条目,无论如何),获取日期(这将采用unix时间格式ex:'12456771411')。

获取当前的unixtime并用它做点什么

$time = mktime();
if($time - $row['date'] > 30){
 allow them to post
} else {
 30 seconds didn't pass.. etc;
}