在我的网页中,用户填写了一个将信息发送到MySql数据库的表单。发送的数据输入之一是日期/时间,格式为date('l jS \of F Y h:i:s A');
(我可以根据需要更改格式)
因此,当用户提交表单时,我想检查实际时间/日期是否比发送的时间/日期多30秒,以便允许或不允许提交表单。谢谢!
答案 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;
}