1

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

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

这一切都很好,用户可以过滤数据以获得他们想要的不同结果。我一直在查看我的分析帐户,可以看到某些查询比其他查询更受欢迎。我如何让用户知道哪些查询最受欢迎(例如,过去 24 小时内查看最多的查询)。目前我已经制作了一个手动 html 表,我会在早上根据 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}

这样,我可以对具有附加排序参数的查询在特定时间段内进行计数。这是实现这一目标的最佳方法吗?

4

3 回答 3

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. 只考虑实际重要的参数
于 2012-12-23T07:32:14.830 回答
2

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

然后得到类似的东西

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

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

于 2012-12-23T07:40:54.670 回答
2

我认为您应该创建一个带有时间戳、报告、天数等的表,并将它们用作键。

如果:

  • 任何时候参数都可以通过 POST(表单)发送,它们不会出现在 url 中。

  • 任何时候,其中一些可能来自 COOKIES 或其他来源,它们不会出现在 URL 中。

  • 您决定向 URL 添加其他选项,这些选项可能会因页面而异,但不会修改显示的报告类型,例如样式选项,例如 &viewkind=2&colorset=3 或添加随机以使缓存无效,例如 &rnd=83732 或其他任何内容你可能会在未来做出决定。

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

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

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

于 2012-12-23T08:13:08.373 回答