1

データベースのデータを表示するページがあります。ユーザーがデータを表示する前に、いくつかの選択ボックスがあるため、特定の期間のデータを表示することを選択するなど、さまざまな方法でデータをフィルタリングすることを選択できます。getメソッドを使用しているため、URLは次のようになります。

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

これはすべて正常に機能し、ユーザーはデータをフィルタリングして、必要なさまざまな結果を得ることができます。アナリティクスアカウントを表示していますが、一部のクエリが他のクエリよりも人気があることがわかります。どのクエリが最も人気があるか(たとえば、過去24時間に最も多く表示された)をユーザーに知らせるにはどうすればよいですか。現在、Analyticsデータに基づいて午前中に更新する手動のhtmlテーブルを作成しました。

例えば

<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>

id、query、timestampを含むcountというテーブルを追加して、

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

このようにして、追加の並べ替えパラメータを持つクエリで特定の期間のカウントを行うことができます。これを達成するための最良の方法ですか?

4

3 に答える 3

2

タイムスタンプ、レポート、日数などを含むテーブルを作成し、それらをキーとして使用する必要があると思います。

次の場合、これははるかに安全です。

  • パラメータがPOST(フォーム)で送信される場合はいつでも、URLには含まれません。

  • それらの一部がCOOKIESまたは他のソースからのものである可能性があるときはいつでも、それらはURLに含まれません。

  • ページごとに変わる可能性があるが、表示されるレポートの種類を変更しない他のオプションをURLに追加することにしました。たとえば、&viewkind = 2&colorset = 3などのスタイリングオプションや、ランダムに追加して&rnd=83732などのキャッシュを無効にします。あなたは将来決めるかもしれません。

  • ハッシュ#nameのようにURLに追加されたものはすべて干渉する可能性があります(ページの下半分にある名前付きアンカーにジャンプすると、別のレポートと見なされます)

  • また、データベースを攻撃するために完全なURLを偽造することは、単一の整数または文字列名パラメーターを偽造するよりもおそらくはるかに簡単です。

  • また、URLを異なる方法でサイトが呼び出される場合もあります。wwwが前面にあるかどうかにかかわらず、安全な場合はhttpsを使用します。一部のパラメータにはデフォルト値が設定されている場合があります。たとえば、日を指定しない場合は、たとえばdays = 1と同じであるため、レポートは同じですがURLが異なる場合があります。

于 2012-12-23T08:13:08.373 に答える
2

もう少し進んで、次のことを考慮します。

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

基本的には次のものと同じです。

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

それが表現するものに関してですが、あなたが言及したアルゴリズム$_SERVER['QUERY_STRING'];は異なるため、2つの異なるレポートとしてそれらを記録します。

また、アプリのビジネスロジックの観点からは、追加のパラメーターは使用されない場合がありますが、次のようになります。

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時間に最もリクエストされたURLを取得します。

于 2012-12-23T07:40:54.670 に答える