Я делаю систему подсчета посетителей для сообщений о пользователях, чтобы показывать наиболее просматриваемые сообщения на главной странице. Теперь у меня есть система подсчета посетителей, но все они регистрируют представление при каждом обновлении страницы. Я не могу использовать Google Analytics.
Мне нужен счетчик посетителей, который учитывает только уникальных посетителей. В моем случае уникальное означает, что один человек может просматривать сообщение только через день? Думаю, даже неделю может работать. Можете ли вы написать этот PHP-код здесь? Вы также можете дать мне ссылку на некоторые полезные уроки, если вам тоже нравится.
Это то, что код должен делать (или эквивалент):
http://coursesweb.net/php-mysql/register-show-online-users-visitors_t
Вот хороший учебник, это то, что вам нужно.
Зарегистрируйте и покажите онлайн-пользователям и посетителям
Count Online пользователи и посетители, использующие таблицу 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 ?>
3. Если вы хотите включить скрипт в файл «.php», добавьте следующий код в том месте, где вы хотите показать количество пользователей и посетителей онлайн:
4 – Чтобы показать количество онлайн-посетителей / пользователей в файле .html, используйте этот код:
<script type="text/javascript" src="usersontxt.php?uvon=showon"></script>
Этот скрипт (и другой представленный ниже) работает с $ _SESSION. В начале файла PHP, в котором вы его используете, вы должны добавить: session_start () ;. Количество пользователей и посетителей онлайн с помощью таблицы MySQL
Чтобы регистрировать, подсчитывать и показывать количество онлайн-посетителей и пользователей в таблице MySQL, необходимо выполнить три SQL-запроса: удалить записи старше определенного времени. Вставьте строку с новым пользователем / посетителем или, если она уже вставлена, обновите метку времени в ее столбце. Выберите оставшиеся строки. Вот код для скрипта, который использует таблицу MySQL (с именем «userson») для хранения и отображения онлайн-пользователей и посетителей.
1-Сначала мы создаем таблицу «userson» с двумя столбцами (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 ?>
Примеры с использованием этих сценариев
• Включая «usersontxt.php» в php-файле:
Счетчик онлайн-пользователей и посетителей
• Включая «usersmysql.php» в html-файле: Counter Online Users and Visitors
Оба сценария (с сохранением данных в текстовом файле на сервере или в таблице MySQL) будут отображаться следующим образом: Online: 5
Посетителей: 3 Пользователей: 2 – MarPlo – Marius
Уникальные виды всегда являются твердой гайкой для взлома. Проверка IP может работать, но IP-адрес может использоваться несколькими пользователями. Файл cookie может быть жизнеспособным вариантом, но файл cookie может истечь или быть изменен клиентом.
В вашем случае это не кажется большой проблемой, если файл cookie изменен, поэтому я бы рекомендовал использовать файл cookie в таком случае. Когда страница загружена, проверьте, есть ли файл cookie, если нет, создайте его и добавьте +1 к представлениям. Если он установлен, не делайте +1.
Установите дату истечения срока действия файлов cookie на то, что вы хотите, неделю или день, если это то, что вы хотите, и оно истечет после этого времени. После истечения срока действия он снова станет уникальным пользователем!
Редактировать:
Думал, что было бы неплохо добавить это уведомление здесь …
С конца 2016 года IP-адрес (статический или динамический) рассматривается как персональные данные в ЕС.
Это означает, что вам разрешено только хранить IP-адрес с хорошей причиной (и я не уверен, что отслеживание является хорошей причиной). Поэтому, если вы намерены хранить IP-адрес посетителей, я бы рекомендовал хешировать или шифровать его с помощью алгоритма, который не может быть отменен, чтобы убедиться, что вы не нарушаете какой-либо закон (особенно после того, как были приняты законы GDPR).
для выяснения того, что пользователь является новым или старым, получите IP-адрес пользователя.
создать таблицу для IP-адресов и временную метку их посещений.
проверьте, что IP-адрес не существует ИЛИ время () – saved_timestamp> 60 * 60 * 24 (на 1 день), отредактируйте time()
метку IP на time()
(теперь означает) и увеличьте свой вид.
иначе ничего не делайте.
FYI : пользовательский IP хранится в переменной $_SERVER['REMOTE_ADDR']
Я редактировал код «Лучший ответ», хотя я нашел полезную вещь, которая отсутствовала. Это также будет отслеживать ip пользователя, если они используют прокси-сервер, или просто, если сервер имеет nginx, установленный как реверсор прокси.
Я добавил этот код в свой скрипт в верхней части функции:
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.
$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