2010-05-27 55 views
2

在我的网页的用户填写谁MySQL数据库发送信息的表格。其中一个发送的数据输入是日期/时间,在date('l jS \of F Y h:i:s A'); (如需要,我可以改变格式)等待30秒以便允许在PHP和MySQL上执行新操作?

因此,当用户提交我要检查,如果实际时间/日期为形式的格式为了允许或不允许提交表格,比发送的时间/日期多30秒。谢谢!

+0

嘿,我提起你的语法;让我知道如果问题仍然代表您的需求。 – 2010-05-27 19:19:29

+0

它的好的谢谢.. – DomingoSL 2010-05-27 19:25:09

回答

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!"; 
    } 
?> 
+0

哇,这是一个很好的答案。谢谢! – DomingoSL 2010-05-27 19:35:54

2

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

如果你想禁止在浏览器端提交,您将需要的JavaScript。

例如(过度为清楚起见详细):

<?php 
    session_start(); 

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

在客户端做的所有operetions都是安全失败cuz用户可以破解 – DomingoSL 2010-05-27 19:16:48

+2

您的会话变量存储在服务器端,如果您担心会话变量存在保护会话的方法。 – jeroen 2010-05-27 19:18:28

+0

失败............ – DomingoSL 2010-05-27 19:21:09

0

你可以很容易地通过使你的mysql日期是unix_time做到这一点。然后你会做一个插入语句mktime()

这是最简单迄今为止的方法来检查,如果它在30秒内完成为UNIX时间是第二计数。所以,只是做在第2后在后一个数比较,mktime()和mktime(),减,如果结果为> 30,做任何你需要。

例子:(的要求)

做进入数据库的初始插件,为表中的日期/时间值,如果用户试图使用mktime()

的结果再次发帖,检查帖子是否存在(或最后一个入口,不管),获取日期(这将是unix时间格式,例如:'12456771411')。

获得当前unixtime并用它做什么

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

可否请给我一个代码示例? – DomingoSL 2010-05-27 19:19:53

+0

如果您要更改列类型,最好将其更改为日期时间。这样,所有丰富的日期时间功能,包括比较功能和输出特定文本格式都可用。而且你不会遇到时代问题。 – dnagirl 2010-05-27 19:36:38

1

如果我理解正确的话,你想创建一个表单30秒后说:“过期”?

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

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

然后,您可以检查此当表单提交:

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

你也可以做它使用JavaScript在客户端上检查表单提交 - 不过这将取决于客户端的时钟是大致正确相比,服务器...

+0

你不了解我。我想在发送表单时将时间和日期存储在我的数据库中,如果用户试图再次发送它,我需要将新日期时间与之前存储的日期时间进行比较,以确定是否有30秒的时间。 – DomingoSL 2010-05-27 19:24:11

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); 

如果你没有记录回,这意味着表单不应该被处理。