Nir*_*rav 25 php mysql visitor-statistic counting
我正在为用户帖子制作一个访客计数系统,以显示主页上浏览次数最多的帖子.我现在有一个访客计数系统,但它在每次页面刷新时注册了一个视图.我无法使用Google Analytics.
我需要的是一个仅限独特访客的访客柜台.在我的情况下,独特意味着一个人只能在一天内查看帖子?我想,即使一周也可能有效.你能在这里写那个PHP代码吗?如果您也喜欢,也可以给我一些好的教程链接.
这是代码需要做的(或等效的):
Mih*_*hai 18
http://coursesweb.net/php-mysql/register-show-online-users-visitors_t
这是一个很好的教程,是你需要的.
注册并显示在线用户和访客
使用MySQL表计算在线用户和访客在本教程中,您可以了解如何在网页中注册,计数和显示在线用户和访客的数量.原理是:每个用户/访客都在文本文件或数据库中注册.每次访问网站页面时,php脚本都会删除超过特定时间(例如2分钟)的所有记录,添加当前用户/访问者并记录剩余的记录数.
您可以将在线用户和访客存储在服务器上的文件中,也可以存储在MySQL表中.在这种情况下,我认为使用文本文件来添加和读取记录比将它们存储到MySQL表中更快,这需要更多的请求.
首先,它提供了在服务器上的文本文件中记录的方法,而不是使用MySQL表的方法.
要使用本教程中提供的脚本下载文件,请单击 - >计算在线用户和访问者.
•两个脚本都可以包含在" .php"文件(包含include())或" .html"文件(包含)中,如本页底部显示的示例所示; 但服务器必须运行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
?>
Run Code Online (Sandbox Code Playgroud)
3 - 如果要将上述脚本包含在".php"文件中,请在要显示在线用户和访问者数量的位置添加以下代码:
4 - 要显示".html"文件中的在线访问者/用户数,请使用以下代码:
<script type="text/javascript" src="usersontxt.php?uvon=showon"></script>
Run Code Online (Sandbox Code Playgroud)
此脚本(以及下面介绍的其他脚本)适用于$ _SESSION.在您使用它的PHP文件的开头,您必须添加:session_start();. 使用MySQL表统计在线用户和访客
要注册,计算和显示MySQL表中的在线访问者和用户数,需要执行三个SQL查询:删除超过特定时间的记录.使用新用户/访问者插入行,或者,如果已插入,则更新其列中的时间戳.选择剩余的行.这是使用MySQL表(名为"userson")来存储和显示在线用户和访问者的脚本的代码.
1 - 首先我们创建"userson"表,有2列(uvon,dt).在"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
?>
Run Code Online (Sandbox Code Playgroud)
使用这些脚本的示例
•在php文件中包含"usersontxt.php":
柜台在线用户和访客
•在html文件中包含"usersmysql.php":计数器在线用户和访问者
这两个脚本(将数据存储在服务器上的文本文件中,或存储到MySQL表中)将显示如下结果:在线:5
访客:3位用户:2 - MarPlo - Marius
Jit*_*ite 12
独特的观点始终是一个难以破解的难题.检查IP可能有效,但IP可以由多个用户共享.Cookie可能是一个可行的选项,但Cookie可能会过期或被客户端修改.
在你的情况下,如果cookie被修改,它似乎不是一个大问题,所以我建议在这种情况下使用cookie.加载页面时,检查是否有cookie,如果没有,请创建一个并为视图添加+1.如果已设置,请不要执行+1.
将Cookie到期日期设置为您想要的日期,周或日,如果这是您想要的,它将在该时间后过期.到期后,它将再次成为一个独特的用户!
编辑:
 
认为在此添加此通知可能是一个好主意... 
自2016年底以来,IP地址(静态或动态)被视为欧盟的个人数据.
这意味着您只能以合理的理由存储IP地址(而且我不确定跟踪视图是否是一个很好的理由).因此,如果您打算存储访问者的IP地址,我建议使用无法撤消的算法对其进行散列或加密,以确保您没有违反任何法律(特别是在实施GDPR法律之后).
小智 8
我编辑了"最佳答案"代码,但我找到了一个缺少的有用的东西.如果用户正在使用代理,或者只是服务器已将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();
Run Code Online (Sandbox Code Playgroud)
我是否编辑了他的代码.
找到说明以下内容的行:
// 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;
Run Code Online (Sandbox Code Playgroud)
并将其替换为:
$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $adresseip. $vst_id;
Run Code Online (Sandbox Code Playgroud)
这会奏效.
如果发生任何事情,这是完整的代码:
<?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
Run Code Online (Sandbox Code Playgroud)
还没有在Sql脚本上测试过这个.
找出该用户是新的还是旧的,获取用户IP.
为IP及其访问时间戳创建一个表.
检查如果IP不存在或者time() -  saved_timestamp> 60*60*24(1天),请将IP的时间戳编辑为time()(表示现在)并增加视图.
否则,什么也不做.
仅供参考:用户IP存储在$_SERVER['REMOTE_ADDR']变量中