2011-05-24 29 views
-1

我有一個PHP搜索引擎,許多人都在使用它。我想要做的是,當有人搜索超過25次,然後給他一個警告,說你已經超過了今天的限制,並且不允許進一步改變。如何限制用戶搜索?

我該怎麼用PHP的mysql?或者使用cookie或會話更好?如果是的話,它會怎麼做?

+6

爲什麼地球上做你想做的事是什麼? – SLaks 2011-05-24 16:49:19

+0

cookie /會話可以被用戶刪除,所以它會更像是一個軟限制,如果你想安全地保存每個ip的請求數和一個表中的時間戳,並基於該請求採取行動,或者如果沒有這筆交易使用一些非持久性鍵值存儲(如APC)(性能更好) – Hannes 2011-05-24 16:50:10

回答

2

你可以在MySQL創建表與用戶ID(或任何其他唯一標識信息),表示當前日的日期,以及計數器字段,您可以通過1每次他做了搜索時間增加。然後在啓動搜索之前檢查計數器,如果計數器爲25,則不允許搜索。

使用會話,APC,內存緩存,餅乾等,並不能保證你將能夠容納的極限。

如果使用APC或內存緩存或任何其他系統,設計用於高速緩存,內存限制可能會耗盡你儲存在該密鑰將消失,從而允許用戶25個新的搜索。

如果使用會話,用戶只需註銷並重新登錄,並獲得25次新的搜索。

如果使用cookies,用戶可以簡單地改變或移除瀏覽器的cookie的,從而使新的搜索一次。

永遠不要信任用戶或緩存系統。

0
session_start(); 
if (isset($_POST['q'])) { // insert your query parameter instead of 'q' 
    // Determine if the search counter exists 
    if (isset($_SESSION['search_counter'])) { 
     if ($_SESSION['search_counter'] > 25) { 
      // Rate-limit message here 
     } 
    } 
    else { 
     // Create a session key to hold the search counter. 
     $_SESSION['search_counter'] = 0; 
    } 
    // Increment the counter after every search. 
    $_SESSION['search_counter']++; 
} 
+0

由於您之後立即增加 – 2011-05-24 16:52:26

+0

好點,因此您需要初始化爲0。固定。 – 2011-05-24 16:53:26

0

如果這些用戶不存儲在服務器端會話的數據記錄是最可靠的辦法,如餅乾可以很容易地清除。但即使這樣也可以繞開。如果它真的是一個大問題 - 讓他們進行身份驗證,然後將這些數據綁定到他們在服務器上的會話和用戶信息,那麼如果它被清除,您可以再次檢查數據庫,然後讓他們執行操作。這會抑制性能,所以你的里程可能會有所不同。

1

您可以用餅乾做,但是:

  1. Cookies只能識別1臺計算機上1個瀏覽器。
  2. Cookie可以被刪除。

因此,所有用戶需要做的是更改瀏覽器,計算機或清除他/她的Cookie,並且他們有一組全新的搜索。

你可以使用一個會話變量做到這一點,但是:

  1. 除非你明確地設置會話到期,它將一旦關閉瀏覽器結束。

所以,用戶需要做的就是關閉並重新打開瀏覽器,然後他們會有一組新的搜索。

因此,「棘手」的選擇是存儲搜索記錄的增量計數在數據庫中,但是:

  1. 用戶必須在/先登錄才能查詢創建一個帳戶,否則你」 d必須依靠IP地址來識別用戶,這不是100%可靠的,可能對您的需求太粗糙。

儘管如此,這仍然是最好的選擇。

有很多方法可以設計和實現數據庫模式,並且老實說,如何做到這一點將取決於究竟是每天有多少用戶和用戶搜索。

但是,基本算法(不考慮數據庫設計的)是:

  1. 網站:用戶登錄/創建帳戶
  2. MySQL的:新用戶創建記錄
  3. 網站:用戶執行搜索
  4. MySQL的:檢查以確保用戶不超過他/她的極限了一天
    1. (TRUE)的MySQL:返回一個錯誤消息
    2. (FALSE)的MySQL:執行搜索和返回結果
  5. 網站:顯示錯誤消息或導致