在我的网页的用户填写谁MySQL数据库发送信息的表格。其中一个发送的数据输入是日期/时间,在date('l jS \of F Y h:i:s A');
(如需要,我可以改变格式)等待30秒以便允许在PHP和MySQL上执行新操作?
因此,当用户提交我要检查,如果实际时间/日期为形式的格式为了允许或不允许提交表格,比发送的时间/日期多30秒。谢谢!
在我的网页的用户填写谁MySQL数据库发送信息的表格。其中一个发送的数据输入是日期/时间,在date('l jS \of F Y h:i:s A');
(如需要,我可以改变格式)等待30秒以便允许在PHP和MySQL上执行新操作?
因此,当用户提交我要检查,如果实际时间/日期为形式的格式为了允许或不允许提交表格,比发送的时间/日期多30秒。谢谢!
所以,你必须像...
<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!";
}
?>
哇,这是一个很好的答案。谢谢! – DomingoSL 2010-05-27 19:35:54
您可以将提交时间存储在会话变量中(无论您的日期格式如何,只需在服务器上存储time()
的结果),并检查在对提交采取任何操作之前是否设置了该变量。
如果你想禁止在浏览器端提交,您将需要的JavaScript。
例如(过度为清楚起见详细):
<?php
session_start();
if (isset($_SESSION['submit_time']))
{
if ($_SESSION['submit_time'] >= (time() - 30))
{
die();
}
}
$_SESSION['submit_time'] = time();
?>
你可以很容易地通过使你的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;
}
如果我理解正确的话,你想创建一个表单30秒后说:“过期”?
我将在表单中创建一个隐藏的元素:
<input name="current_time" type="hidden" value="<?php echo time(); ?>"
然后,您可以检查此当表单提交:
<?php
if((time() - $_POST['current_time']) > 30) {
echo "Time's up!";
}
?>
你也可以做它使用JavaScript在客户端上检查表单提交 - 不过这将取决于客户端的时钟是大致正确相比,服务器...
你不了解我。我想在发送表单时将时间和日期存储在我的数据库中,如果用户试图再次发送它,我需要将新日期时间与之前存储的日期时间进行比较,以确定是否有30秒的时间。 – DomingoSL 2010-05-27 19:24:11
如果你坚持你的储存日期时间的文本版本,我建议你还存储日期时间的日期时间版本。然后比较很容易。
没有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);
如果你没有记录回,这意味着表单不应该被处理。
嘿,我提起你的语法;让我知道如果问题仍然代表您的需求。 – 2010-05-27 19:19:29
它的好的谢谢.. – DomingoSL 2010-05-27 19:25:09