显示最热门的QUERY_STRING

时间:2012-12-23 07:24:48

标签: php mysql

我有一个显示数据库数据的页面。在用户看到数据之前,他们有几个选择框,因此他们可以选择以多种不同的方式过滤数据,例如选择在一段时间内显示数据。因为我正在使用get方法,所以url看起来与下面类似。

http://www.example/com?report=2&days=7&etc=2

一切正常,用户可以过滤数据以获得他们想要的不同结果。我一直在查看我的分析帐户,可以看到某些查询比其他查询更受欢迎。如何让用户知道哪些查询最受欢迎(例如,过去24小时内查看次数最多)。目前我已经制作了一个手动html表,我在早上根据Google Analytics数据进行了更新。

例如

<table>
<tbody>
<tr><th>query</th><th>link</th></tr>
<tr><td>Show data from last 7 days</td><td><a href="http://www.example/com?report=2&days=7&etc=2">View</a></td></tr>
</tbody>
</table>

我考虑过添加一个名为count的表,它有id,query,timestamp和say

$a='report=';
$b=$_SERVER['QUERY_STRING'];
if($b == $a . $report['id'])
{}
else
{//Insert id, query, timestamp into the database}

这样我可以对具有额外排序参数的查询进行一段时间的计数。这是实现这个目标的最好方法吗?

3 个答案:

答案 0 :(得分:2)

我会多考虑一下,并考虑以下因素:

http://www.example/com?report=2&days=7&etc=2

基本上与:

相同
http://www.example/com?report=2&etc=2&days=7

关于它表达的内容,但您提到的算法会将它们记录为2个不同的报告,因为$_SERVER['QUERY_STRING'];不同。

此外,从您的应用业务逻辑角度来看,可能不会使用额外的参数,但会出现:

http://www.example/com?report=2&etc=2&days=7&utm_source=feed

所以,我会对构成查询键的参数进行一些处理:

  1. 按参数名称排序
  2. 只考虑实际重要的参数

答案 1 :(得分:2)

创建一个表,用于存储url的查询部分和时间戳。它不需要其他字段,因为您将获得最新呼叫的运行总和。

然后得到像

这样的东西
select url, 
       count(*) as reqs 
  from queries 
 where ts > now() - interval 24 hour 
 group by url 
 order by reqs desc

获取过去24小时内请求最多的网址。

答案 2 :(得分:2)

我认为您应该创建一个包含时间戳,报告,日期等的表格,并将其用作关键字。

如果出现以下情况则更安全:

  • 任何时候参数都可以通过POST(表格)发送,它们不会在网址中。

  • 任何时候其中一些可能来自COOKIES或其他来源,他们不会在网址中。

  • 您决定向网址添加其他选项,这些选项可能会因网页而异,但不会修改所显示的报告类型,例如&amp; viewkind = 2&amp; colorset = 3等样式选项或添加随机使缓存无效,例如&amp; rnd = 83732或您将来决定的任何其他内容。

  • 其他任何添加到网址的内容,如哈希#name可能会干扰(跳转到页面底部的命名锚点将被视为不同的报告)

  • 同样,伪造一个完整的URL来攻击你的数据库可能比伪造单个整数或字符串名称参数容易得多

  • 您的网站也可能以不同的方式调用,使网址不同。使用www在前面或没有,使用https如果安全。某些参数可能具有默认值,因此例如,不指定天数可能与天数= 1相同,因此报告可能相同但URL不同。