【问题标题】:Show most popular QUERY_STRING显示最受欢迎的 QUERY_STRING
【发布时间】:2012-12-23 07:24:48
【问题描述】:

我有一个页面显示我的数据库中的数据。在用户看到数据之前,他们有几个选择框,因此他们可以选择以多种不同方式过滤数据,例如选择在特定时间段内显示数据。当我使用 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 和说

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

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

    然后得到类似的东西

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

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

    【讨论】:

      【解决方案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. 只考虑实际重要的参数

      【讨论】:

      • 可能是浪费时间,因为 OP 可以控制生成查询的 gui。
      • 您认为在 1 个月内他必须在该页面添加一些新功能时记得保持 URL 不变?或者是在这些页面上添加/更新功能的同事?
      • 我认为这并不重要,因为运行总和将超过 24 小时。
      • 您的陈述基于一些错误的假设: 1 - 报告在未来不会改变/发展(这种情况很少发生); 2 - 参与开发的每个人都将意识到需要将参数固定为顺序和数量。 3 - 当操作人员说它们是过去 7 天的报告时,报告是 24 小时的。您的解释在一套严格的规则中是有道理的,但我的指导方针并不难实施,也不费时来施加这些限制
      • 不,7 天是查询的一部分。 OP 说“(例如在过去 24 小时内观看次数最多)”,这是我的假设。此外,“我有 a 页面...选择几个框”。这让我认为订单确实是固定的。如果这些更改,那么您在该排序中是正确的可能会有所帮助。我认为初始方法始终应尽可能简单。
      【解决方案3】:

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

      这样会更安全,如果:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2021-02-20
        • 2016-10-23
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多