web-dev-qa-db-ja.com

ユニークビジターのみを追跡しますか?

現在、「hits.php」というファイルがあり、ページのヒットを追跡したいページでは、<?php include("hits.php"); ?>を使用します。

ただし、ユニークビジターのみを追跡するにはどうすればよいですか?同じ人が更新できてヒット数が増えるので、私のヒット数は誤りです。

これが私の情報源です:

<?php
 $hits = file_get_contents("./client/hits.txt"); 
 $hits = $hits + 1; 

 $handle = fopen("./client/hits.txt", "w"); 
 fwrite($handle, $hits); 
 fclose($handle); 

 print $hits; 

?>

どうすればCookieチェックができるのかよくわかりません... IPをチェックする方法はありますか?または私は何ができますか?

StackOに感謝します。

15
Kyle

最も簡単な方法は、Cookieのチェックです。

より良い方法は、SQLデータベースを作成し、IPアドレスを主キーとして割り当てることです。その後、ユーザーがアクセスするたびに、そのIPをデータベースに挿入します。

  1. $_SESSION['logged']をチェックするすべてのページに含まれる関数を作成します。この関数には、任意の「フラグ」を割り当てることができます。
  2. $_SESSION['logged']が「false」を返す場合は、そのIPアドレスをMySQLデータベースに挿入します。
  3. $_SESSION['logged']を「true」に設定して、IPを何度もログに記録するリソースを無駄にしないようにします。

注:MySQLテーブルを作成するときは、「IPアドレス」フィールドをキーとして割り当てます。

<?php 
  session_start();
  if (!$_SESSION['status']) {
    $connection = mysql_connect("localhost", "user", "password");
    mysql_select_db("ip_log", $connection);

    $ip = $_SERVER['REMOTE_ADDR'];
    mysql_query("INSERT INTO `database`.`table` (IP) VALUES ('$ip')");

    mysql_close($connection);
    $_SESSION['status'] = true;
  }
?>
17
user372743

完璧な解決策はありませんが、最初の2つの方法(IPアドレスやCookie)が最も信頼性が高く、組み合わせた方が良い場合があります。

車輪の再発明ではなく、既成のソリューションを使用しました。商業的な理由で、私はグーグルアナリティクスを避けました(私はグーグルに私のウェブ統計を知られたくありません-彼らの最善の利益は私のものではありません)。非営利のウェブサイトや、広告にGoogleを使用していない場合はおそらく問題ありません。選択肢も数十あります。たとえば、Getclicky.comを使用します

3
winwaed
  1. 基本的なレベルでは、PHP $_SERVER['REMOTE_ADDR']プロパティを使用してクライアントのIPアドレスを取得できます
  2. Cookieの設定またはセッションの使用を検討してください。ただし、これはCookieの削除またはCookieの拒否によって無効になる可能性があります。詳細については、PHP setcookie ドキュメントを参照してください。
  3. ブラウザのフィンガープリントには他の方法があります-おそらく使用できるさまざまなデータをすべてチェックしてください https://panopticlick.eff.org/index.php
2
JAL

あなたができない場合はグーグルアナリティクスはどうですか。データベースを作成したり、IPを含む別のファイルを作成したりすることはできますが、そのようなフラットファイルでは複雑になる可能性があります。

2
Matt

私は非常に質の悪い解決策とそれを行うための迅速で汚い方法を見つけました。

私も似たようなものを開発していて、冗長性なしで機能する迅速な方法を考案していました。

誰かが別のユーザーのプロファイルにアクセスするたびにカウンターが必要でした。

擬似:

  • 閲覧者の名前と閲覧者の名前でテーブルを作成します(daily_viewsテーブル)。
  • 視聴者の名前と視聴者の名前(同じ行)が存在するかどうかを確認します。
  • それらが存在しない場合は、ユーザーカウンター+1を更新します(usersテーブル内)。
  • それ以外は何もしません。
  • Cronジョブを介して、24/12時間ごとにテーブル値全体をnullにリセットします。

これは、同じユーザープロファイルにアクセスして、1日(または12時間)の更新時にカウンターに1を追加することを拒否しますが、Glenn Nelsonによる上記のソリューションは実際にカウンターに1を追加しますが、追加を拒否しますすべて同時にユーザーのカウンター。

これだけでなく、ログオフしてWebサイトに再度ログインすると、カウンターに再度追加されるだけで、場合によってはトロールやhaxorz志望者がこれを悪用します(セッションが破棄されて再開されるため)。

これが私のサンプルテーブルです:

users 
{
user_id INT(8) auto increment, user_name varchar(32), user_counter INT(12)
};
daily_views
{
view_id INT(8) auto increment, viewer_name VARCHAR(32), viewee_name VARCHAR(32)
};

これが私が書いたサンプルコードです:

<?php
session_start();
$uname = $_SESSION['username'];
$vieweepage = $_GET['name']; //gets the name of the persons page/profile via previous page/form
$connect = mysql_connect("localhost","user","password") or die("Couldn't connect; check your mysql_connect() settings");
$database = mysql_select_db("database") or die("Could not locate database!");

$query = mysql_query("SELECT user_counter from users");
$query = mysql_fetch_row($query);
$counter = $query[0];
$viewcheck = mysql_query("SELECT viewer_name from daily_views WHERE viewee_name='$vieweepage'");
$viewrow = mysql_num_rows($viewcheck);

$newcounter = $counter + 1;

if($viewrow == 0)
{
$update = mysql_query("UPDATE users SET user_counter='$newcounter' WHERE user_name='$vieweepage'");
$insert = mysql_query("INSERT into daily_views (viewer_name, viewee_name) VALUES ('$uname', '$vieweepage')");
}
?>
1
Sam Gungormez

タイムスタンプをjavascriptのlocalStoageに保存できます。 LocalStoageはブラウザによって削除されないため、保存して確認する必要があります。サーバーサイドチェックではないことは知っていますが、とにかく役立つかもしれません。

0
Sebastian Td

現在、visitorにremote addresssession IDを使用しています。1人のユーザーが1日に何度も訪問できず、カウンターは更新に依存せず、新しいセッションにのみ依存するため、有効な訪問者だと思います。