web-dev-qa-db-ja.com

サイトへのユニークビジターをカウントするにはどうすればよいですか?

ホームページで最も閲覧された投稿を表示するために、ユーザー投稿のビジターカウントシステムを作成しています。現在、ビジターカウントシステムがありますが、ページを更新するたびにビューが登録されます。 Google Analyticsを使用できません。

必要なのは、ユニークビジターのみをカウントするビジターカウンターです。私の場合、ユニークとは、1人の人が1日にしか投稿を表示できないことを意味します一週間でもうまくいくと思う。ここにそのphpコードを記述できますか?必要に応じて、優れたチュートリアルへのリンクも提供できます。

これは、コードが行う必要がある(または同等の)ものです。

  1. ページが読み込まれたら、訪問者が新しいか古いかを確認します(どうすればいいかわかりません..)
  2. 彼が年老いた場合、彼を無視します
  3. 彼が新しい場合、mysqlでは、views = views + 1
24
Nirav

http://coursesweb.net/php-mysql/register-show-online-users-visitors_t

ここにニースのチュートリアルがあります、あなたが必要なものです。

オンラインユーザーと訪問者を登録して表示する

MySQLテーブルを使用してオンラインユーザーと訪問者をカウントするこのチュートリアルでは、オンラインユーザーと訪問者の数を登録し、カウントし、Webページに表示する方法を学習できます。原則は次のとおりです。各ユーザー/訪問者はテキストファイルまたはデータベースに登録されます。 Webサイトのページにアクセスするたびに、phpスクリプトは特定の時間(2分など)より古いすべてのレコードを削除し、現在のユーザー/訪問者を追加して、表示される残りのレコード数を取得します。

オンラインユーザーと訪問者をサーバー上のファイルまたはMySQLテーブルに保存できます。この場合、レコードの追加と読み取りにテキストファイルを使用する方が、レコードをMySQLテーブルに保存するよりも高速で、より多くのリクエストが必要だと思います。

最初に、MySQLテーブルを使用する方法よりも、サーバー上のテキストファイルに記録する方法を示します。

このチュートリアルに記載されているスクリプトを使用してファイルをダウンロードするには、「-> Count Online Users and Visitors」をクリックします。

•両方のスクリプトは、「。php」ファイル(include()を含む)または「。html」ファイル(withを含む)に含めることができます。このページの下部にある例で見ることができます。ただし、サーバーはPHPを実行する必要があります。オンラインユーザーと訪問者をテキストファイルに保存する

PHP=を使用してサーバー上のファイルにレコードを追加するには、そのファイルにCHMOD 0766(またはCHMOD 0777)権限を設定する必要があります。そのため、PHP初期化。

1-サーバー上にテキストファイル(たとえば、「userson.txt」という名前)を作成し、CHMOD 0777パーミッションを付与します(FTPアプリケーションで、そのファイルを右クリックして[プロパティ]を選択し、[読み取り]、[書き込み]、[実行]オプションを選択します)。 2-以下のコードを持つPHPファイル( "usersontxt.php"という名前))を作成し、このphpファイルを "userson.txt"と同じディレクトリにコピーします。usersontxt.phpのコード

<?php
// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>

3-「。php」ファイルに上記のスクリプトを含める場合は、オンラインユーザーと訪問者の数を表示する場所に次のコードを追加します。

4-「。html」ファイルのオンライン訪問者/ユーザーの数を表示するには、次のコードを使用します。

<script type="text/javascript" src="usersontxt.php?uvon=showon"></script>

このスクリプト(および以下に示す他のスクリプト)は、$ _ SESSIONで機能します。 PHPファイルを使用するファイルの先頭に、次を追加する必要があります。session_start();. MySQLテーブルを使用するオンラインユーザーと訪問者をカウントする

MySQLテーブルのオンライン訪問者とユーザーの数を登録、カウント、表示するには、次の3つのSQLクエリを実行する必要があります。特定の時間より古いレコードを削除します。新しいユーザー/ visitorで行を挿入します。または、既に挿入されている場合は、列のタイムスタンプを更新します。残りの行を選択します。これは、MySQLテーブル(「userson」という名前)を使用してオンラインユーザーと訪問者を保存および表示するスクリプトのコードです。

1-最初に、2列(uvon、dt)の「userson」テーブルを作成します。 「uvon」列には、ユーザーの名前(ログインしている場合)または訪問者のIPが格納されます。 「dt」列には、ページがアクセスされたときのタイムスタンプ(Unix時間)付きの数値が格納されます。 -次のコードをphpファイルに追加します(たとえば、「create_userson.php」という名前):create_userson.phpのコード

<?php
header('Content-type: text/html; charset=utf-8');

// HERE add your data for connecting to MySQ database
$Host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

// connect to the MySQL server
$conn = new mysqli($Host, $user, $pass, $dbname);

// check connection
if (mysqli_connect_errno()) exit('Connect failed: '. mysqli_connect_error());

// sql query for CREATE "userson" TABLE
$sql = "CREATE TABLE `userson` (
 `uvon` VARCHAR(32) PRIMARY KEY,
 `dt` INT(10) UNSIGNED NOT NULL
 ) CHARACTER SET utf8 COLLATE utf8_general_ci"; 

// Performs the $sql query on the server to create the table
if ($conn->query($sql) === TRUE) echo 'Table "userson" successfully created';
else echo 'Error: '. $conn->error;

$conn->close();
?>

2. - Now we create the script that Inserts, Deletes, and Selects data in the "userson" table (For explanations about the code, see the comments in script).
- Add the code below in another php file (named "usersmysql.php"):
In both file you must add your personal data for connecting to MySQL database, in the variables: $Host, $user, $pass, and $dbname .
The code for usersmysql.php

<?php
// Script Online Users and Visitors - coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();         // start Session, if not already started

// HERE add your data for connecting to MySQ database
$Host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)
$vst_id = '-vst-';         // an identifier to know that it is a visitor, not logged user
$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the rows with visitors
$dt = time();                                    // current timestamp
$timeon = 120;             // number of secconds to keep a user online
$nrvst = 0;                                     // to store the number of visitors
$nrusr = 0;                                     // to store the number of usersrs
$usron = '';                                    // to store the name of logged users

// connect to the MySQL server
$conn = new mysqli($Host, $user, $pass, $dbname);

// Define and execute the Delete, Insert/Update, and Select queries
$sqldel = "DELETE FROM `userson` WHERE `dt`<". ($dt - $timeon);
$sqliu = "INSERT INTO `userson` (`uvon`, `dt`) VALUES ('$uvon', $dt) ON DUPLICATE KEY UPDATE `dt`=$dt";
$sqlsel = "SELECT * FROM `userson`";

// Execute each query
if(!$conn->query($sqldel)) echo 'Error: '. $conn->error;
if(!$conn->query($sqliu)) echo 'Error: '. $conn->error;
$result = $conn->query($sqlsel);

// if the $result contains at least one row
if ($result->num_rows > 0) {
  // traverse the sets of results and set the number of online visitors and users ($nrvst, $nrusr)
  while($row = $result->fetch_assoc()) {
    if(preg_match($rgxvst, $row['uvon'])) $nrvst++;       // increment the visitors
    else {
      $nrusr++;                   // increment the users
      $usron .= '<br/> - <i>'.$row['uvon']. '</i>';          // stores the user's name
    }
  }
}

$conn->close();                  // close the MySQL connection

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. ($nrusr+$nrvst). '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>
  1. サーバーでこれら2つのphpファイルを作成したら、ブラウザーで「create_userson.php」を実行して「userson」テーブルを作成します。
  2. オンラインユーザーと訪問者の数を表示するphpファイルに「usersmysql.php」ファイルを含めます。
  1. または、「。html」ファイルに挿入する場合は、次のコードを追加します。

これらのスクリプトを使用した例

•phpファイルに「usersontxt.php」を含める:

•HTMLファイルに「usersmysql.php」を含める:カウンターオンラインユーザーと訪問者

両方のスクリプト(データをサーバー上のテキストファイルに保存するか、MySQLテーブルに保存する)では、次のような結果が表示されます。オンライン:5

訪問者:3ユーザー:2-MarPlo-マリウス

18
Mihai

ユニークなビューは常にクラックするのが難しいです。 IPの確認は機能する場合がありますが、IPは複数のユーザーで共有できます。 Cookieは実行可能なオプションですが、Cookieは有効期限が切れるか、クライアントによって変更される可能性があります。

あなたの場合、クッキーが変更されても大きな問題ではないようですので、このような場合にはクッキーを使用することをお勧めします。ページが読み込まれたら、Cookieがあるかどうかを確認し、ない場合は作成して、ビューに+1を追加します。設定されている場合、+ 1は行わないでください。

Cookieの有効期限を希望するものに設定します(希望する場合は週または日、それ以降は有効期限が切れます)。有効期限が切れると、再び一意のユーザーになります!


編集:
ここにこの通知を追加することをお勧めします...
2016年の終わり頃から、IPアドレス(静的または動的)はEUでは個人データと見なされます。
これは、正当な理由がある場合にのみIPアドレスを保存できることを意味します(ビューの追跡が正当な理由であるかどうかはわかりません)。したがって、訪問者のIPアドレスを保存する場合は、逆にできないアルゴリズムでハッシュまたは暗号化することをお勧めします。これは、法律に違反していないことを確認するためです(特にGDPRの法律が施行された後)。

12
Jite

「ベストアンサー」コードを編集しましたが、欠落している有用なものを見つけました。これは、ユーザーがプロキシを使用している場合、または単にサーバーにプロキシリバーサーとしてnginxがインストールされている場合にも、ユーザーのIPを追跡します。

このコードを関数の上部にある彼のスクリプトに追加しました。

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

さらに、私は彼のコードを編集しました。

次のような行を見つけます。

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

そして、これに置き換えます:

$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $adresseip. $vst_id;

これは動作します。

何かが起こった場合の完全なコードは次のとおりです。

<?php

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result

まだSqlスクリプトでこれをテストしていません。

8
Broccoli

ユーザーが新しいか古いかを調べるには、ユーザーIPを取得します。

iPとその訪問タイムスタンプのテーブルを作成します。

iFを確認しますIPが存在しません OR time()-saved_timestamp> 60 * 60 * 24(1日))、IPを編集しますタイムスタンプをtime()(現在の意味)に変更し、ビューを増やします。

それ以外の場合は、何もしません。

[〜#〜] fyi [〜#〜]:ユーザーIPは$_SERVER['REMOTE_ADDR']変数

7
Alireza Fallah
$user_ip=$_SERVER['REMOTE_ADDR'];

$check_ip = mysql_query("select userip from pageview where page='yourpage'  and userip='$user_ip'");
if(mysql_num_rows($check_ip)>=1)
{

}
else
{
  $insertview = mysql_query("insert into pageview values('','yourpage','$user_ip')");

  $updateview = mysql_query("update totalview set totalvisit = totalvisit+1 where page='yourpage' ");
}

問題がある場合は、talkerscode公式チュートリアルのコード http://talkerscode.com/webtricks/create-a-simple-pageviews-counter-using-php-and-mysql.php

3
asif