【问题标题】:How to set quota for search queries and avoid pagination eating up the quota如何为搜索查询设置配额并避免分页占用配额
【发布时间】:2013-11-25 02:01:48
【问题描述】:

我的任务是将用户搜索限制为每天 10 个查询。

我在用户表 count_search 中添加了列,该列从 0 开始,在使用搜索时上升到 10。一旦他达到 10,查询就会中断。此值在 24 小时后重置为 0。

这一切都比较简单。我的问题是分页。

我无法区分新的搜索和分页查询,因此即使浏览页面,count_search 也会上升。

我有什么选择?

我可以想到一件事,简单地抓取所有数据并使用 jquery 进行分页浏览器端。

任何想法,类似问题的解决方案?

【问题讨论】:

  • 如果是分页点击,那么count_search -1 ?
  • @RobertRozas 这样可以很容易地避免限制,不是吗?直接在第 2 页进行关键字搜索。
  • 不...在您拥有应用程序的方式中,它总是总和 1... 然后它将是 + 1 - 1(sum = 0) 所以数据库列中不会有任何变化
  • 所以你需要弄清楚如何区分它们?是什么让查询在您眼中与众不同?我假设搜索中的 WHERE 标准。排序依据和限制与“分页”有关。因此,比较并确定它是新的搜索还是分页。也许使用会话来存储基本 SELECT 语句并使用它进行比较。
  • 添加您的计数器代码,添加您的 GET 字符串以进行分页。

标签: php jquery mysql sql pagination


【解决方案1】:

您可以缓存查询(文本查询,而不是结果)并从缓存中获取它。如果它在缓存中,不要+1,如果不是,它是一个新的查询。缓存可以是$_SESSION、APC、db等。

function query_results( $sqlWithoutPager ) {
  if ( $sqlWithoutPager not exists in user's cache ) {
    counter++
  }

  if ( counter > 10 ) {
    // I think not!
    return
  }

  // add pager to query

  // do query and return 1 page of results
}

我只保存查询缓存,而不是计数器,因为缓存长度是计数器。更多数据库表。

$_SESSION 可能是个坏主意,因为用户可以终止他们的会话并开始一个新会话(可能)。

APC 可以工作,但我不知道你是否拥有它,(而且它不是持久的)。

【讨论】:

    【解决方案2】:

    我选择了客户端分页,因为这似乎是解决配额问题的最干净的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2021-11-03
      • 2018-03-25
      相关资源
      最近更新 更多