2010-05-27 54 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); 

如果你沒有記錄回,這意味着表單不應該被處理。