2010-01-15 29 views
1

我有這樣一段代碼來檢查,如果用戶已經創建了一個帳戶的最後一小時:檢查,如果在最後一小時內註冊用戶

$result = mysql_query("SELECT * FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

if (mysql_num_rows($result) > 0) 
    exit('Blablal') 

它不會退出,因爲我想它做什麼,我可以讓我想要多少個帳戶。

你看到任何明顯的問題?我的db表格和字段是正確的

+0

你用什麼SQL將行插入到表? –

+0

爲什麼?那裏沒有錯。它插入正確的INSERT INTO帳戶(名稱,密碼,registration_ip,創建)VALUES('$ username','$ password','$ ip_address',「.time()。」) – leon

回答

0

通過刪除registration_ip = '$_SERVER[REMOTE_ADDR]'子句進行測試。

0

此外,您的sql查詢AND created > ".(time() - 3600));是不正確的最後一個小時。 你想是這樣的:

SELECT ... WHERE ... 
AND created > DATE_SUB(now(), INTERVAL 1 HOUR) 
+0

即時存儲我的日期作爲Unix時間戳.. 。 – leon

0

我本地測試這一點,對我來說,它的表現符合市場預期。我會說這個問題不在你的查詢中,而是在其他地方。檢查您的數據並確保它按預期插入。

此外,您可能希望使用SELECT COUNT來計算列而不是SELECT * - 它應該更快。


    $result = mysql_query("SELECT COUNT(*) FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

    $count = mysql_fetch_array($result); 
    if ($count[0] > 0) exit('BLAH'); 
0

亞達的回答是正確的。唯一的其他評論我要提出的是,你逃避$ _ SERVER [REMOTE_ADDR]使用mysql_real_escape保護免受SQL在起飛的機會,該變量被覆蓋

1

你的問題大概是這樣的,$ _ SERVER [REMOTE_ADDR]

注入

您正在將其直接嵌入到雙引號字符串中。當你想訪問一個雙引號字符串中的數組時,你需要將變量數組訪問放在一對大括號內。

更正串:

「SELECT * FROM帳戶WHERE registration_ip = '{$ _SERVER [' REMOTE_ADDR ']}' AND創建>」(時間() - 3600)

另外,送花兒給人報價。索引,您使用REMOTE_ADDR而不是'REMOTE_ADDR'或'REMOTE_ADDR'

希望這會有所幫助。

+0

您可以在不使用大括號的情況下將數組嵌入到字符串中。另外,在不帶大括號的分析字符串中引用數組時,不需要將索引括在引號中。請參閱http://us3.php.net/manual/en/language.types.string.php#language.types.string.parsing - 檢查第一個數組解析示例。 – emmychan

0

您需要在您嵌入到SQL的SQL中使用{}。我認爲這應該工作。我總是這樣做,因爲我發現它節省了我的時間調試,因爲它似乎有點頻繁地彈出。

$result = mysql_query("SELECT COUNT(*) FROM accounts WHERE registration_ip = '{$_SERVER[REMOTE_ADDR]}' AND created > ".({time()} - 3600)); 

如果這不起作用,請將查詢保存到變量中,將其回顯到頁面以查看它正在發送的內容。

$sql = "SELECT COUNT(*) FROM accounts WHERE registration_ip = '{$_SERVER[REMOTE_ADDR]}' AND created > ".({time()} - 3600)"; 

echo $sql; 
1

我剛上任的空間出來工作正常,現在

registration_ip='$_SERVER[REMOTE_ADDR]' 
相關問題