在我的網頁的用戶填寫誰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