2011-05-24 30 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. 网站:显示错误消息或导致