Передача переменной из JS в PHP

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Есть скрипт, который определяет и отображает ip посетителя страницы.

JavaScript:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>$.getJSON("https://api.ipify.org?format=json", function(data) {$("#gfg").html(data.ip);})</script>
<p id="gfg"></p>

И есть часть кода PHP, который записывает все посещения в лог.
Нужно передать отображаемое значение <p id="gfg"></p> в PHP и записать в лог.

PHP:
<?php
$serv=$_SERVER['SERVER_NAME'];
$rot=$_SERVER['HTTP_REFERER'];
$ip=$_SERVER['REMOTE_ADDR'];
$date=date('d.m.Y|G:i:s');
$bro=$_SERVER['HTTP_USER_AGENT'];
$log=fopen("info.txt","a+");
fwrite($log,"|$serv|$rot|$ip|$date|$bro|\n");
fclose($log);
?>
В данном случае $ip=$_SERVER['REMOTE_ADDR']; - не работает корректно, т.к мой домен на Cloudflare и все ip посетителей отображаются как ip серверов Cloudflare. Поэтому приходится использовать сторонний сервис для определения ip.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Вам надо передавать ajax'ом (xhr, fetch) и на сервере создать "принимающий файл" (или в этом файле метод get или posr)

То есть алгоритм такой:
1. Загружается страница
2. Отрабатывает скрипт
3. Полученные данные скриптом преобразуются в удобный масси в данных для отправки, например в JSON (скрипт отдаёт в этом формате)
4, Отправляются ajax'ом на сервер
5. На сервере пишете в лог

Конечно надо понимать, что если на стороне клиента отключен JS или какие-то другие проблемы с исполнением скрипта, то вы не получите данные. В принципе это актуально и в случае выполнения вашего скрипта + ЭТОТ сторонний скрипт, уверен, блокируется блокировщиками рекламы.

Второй проблема, которая возникнет у вас: если вам надо связать пользователя с этими данными (связка или идентификация). Для этого можно использовать куки или другой уникальный идентификатор (например вшить его в страницу и передавать вместе с данными скрипта)

Надеюсь как написать ajax вы найдёте. Если нет, то приходите ещё раз, поможем.
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Вам надо передавать ajax'ом (xhr, fetch) и на сервере создать "принимающий файл" (или в этом файле метод get или posr)

То есть алгоритм такой:
1. Загружается страница
2. Отрабатывает скрипт
3. Полученные данные скриптом преобразуются в удобный масси в данных для отправки, например в JSON (скрипт отдаёт в этом формате)
4, Отправляются ajax'ом на сервер
5. На сервере пишете в лог

Конечно надо понимать, что если на стороне клиента отключен JS или какие-то другие проблемы с исполнением скрипта, то вы не получите данные. В принципе это актуально и в случае выполнения вашего скрипта + ЭТОТ сторонний скрипт, уверен, блокируется блокировщиками рекламы.

Второй проблема, которая возникнет у вас: если вам надо связать пользователя с этими данными (связка или идентификация). Для этого можно использовать куки или другой уникальный идентификатор (например вшить его в страницу и передавать вместе с данными скрипта)

Надеюсь как написать ajax вы найдёте. Если нет, то приходите ещё раз, поможем.
st.png

У меня примерно такая статистика посещений (скрипт пошарен на определенные страницы)
В целом все отрабатывает как надо, но правда ip отображается cloudflare, а хотелось бы получать реальные ip.

Основная часть...
PHP:
<?php
$file="stat.log";    // файл для записи истории посещения сайта
$col_zap=4999;    // ограничиваем количество строк log-файла

function getRealIpAddr() {
  if (!empty($_SERVER['HTTP_CLIENT_IP']))        // Определяем IP
  { $ip=$_SERVER['HTTP_CLIENT_IP']; }
  elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
  { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; }
  else { $ip=$_SERVER['REMOTE_ADDR']; }
  return $ip;
}

if (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) {$bot='YandexBot';} //Выявляем поисковых ботов
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) {$bot='Googlebot';}
else { $bot=$_SERVER['HTTP_USER_AGENT']; }

$ip = getRealIpAddr();
$date = date("H:i:s d.m.Y");        // определяем дату и время события
$home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];    // определяем страницу сайта
$lines = file($file);
while(count($lines) > $col_zap) array_shift($lines);
$lines[] = $date."|".$bot."|".$ip."|".$home."|\r\n";
file_put_contents($file, $lines);
?>


А эта часть отвечает за отображение лога...
Код:
<?php
if (isset($_GET[col])) { $col=$_GET[col]; } else { $col=20; }
$file=file("stat.log"); ?>

<html>
<head>
<style type='text/css'>
 td.zz {PADDING-LEFT: 3px; FONT-SIZE: 9pt; PADDING-TOP: 2px; FONT-FAMILY: Arial; COLOR: Black;}
</style>
</head>

<body>
<center>
<?php
if ($col>sizeof($file)) { $col=sizeof($file); }
echo "Последние <b>".$col."</b> посещений сайта:"; ?>

<table id="myTable" width="auto" cellspacing="1" cellpadding="1" border="0"
    STYLE="table-layout:fixed">

  <tr bgcolor="#ADD8E6">
 <td onclick="sortTable(0)" class="zz" width="auto"><b>Время и дата</b></td>
 <td onclick="sortTable(1)" class="zz" width="450"><b>Данные о посетителе</b></td>
 <td onclick="sortTable(2)" class="zz" width="auto"><b>IP/прокси</b></td>
 <td onclick="sortTable(3)" class="zz" width="auto"><b>Посещенный URL</b></td>
</tr>

<?php
   for ($si=sizeof($file)-1; $si+1>sizeof($file)-$col; $si--) {
   $string=explode("|",$file[$si]);
   $q1[$si]=$string[0]; // дата и время
   $q2[$si]=$string[1]; // имя бота
   $q3[$si]=$string[2]; // ip бота
   $q4[$si]=$string[3]; // адрес посещения    
echo '<tr bgcolor="#B0E0E6"><td class="zz">'.$q1[$si].'</td>';
echo '<td class="zz">'.$q2[$si].'</td>';
echo '<td class="zz">'.$q3[$si].'</td>';
echo '<td class="zz">'.$q4[$si].'</td></tr>';
}
echo '<br>Просмотреть последние <a href=?col=20>20</a> | <a href=?col=50>50</a>';
echo '<br>Просмотреть <a href=?col='.sizeof($file).'>все посещения</a>.</center>';
?>
</table></center></body></html>
 
Последнее редактирование:

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Есть и такой вариант определения ip (через сторонний сервис)

<?php
$ip=file_get_contents("https://api.ipify.org");
$log=fopen("info.txt","a+");
fwrite($log,"|$ip|\n");
fclose($log);
?>

но тут уже записывается ip моего хостинга...
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Вместо подключения файла статистики (он наверняка где-то include'ится) - надо слать в него стату аяксом (фетчем)
HTML:
<script>$.getJSON("https://api.ipify.org?format=json", function(data) {
        $("#gfg").html(data.ip);
        fetch('log.php/?ip='+data.ip)
            .then(()=>{console.log('Данные переданы')});
})</script>
(если есть jQ, можете переписать на ajax от jQ)
log.php - это ваш файл "основная часть"

А функцию получения IP модернизировать
PHP:
function getRealIpAddr() {
    if( !empty($_GET['ip']) ){
        $ip= htmlentities($_GET['ip']);
    } elseif (!empty($_SERVER['HTTP_CLIENT_IP']))
(код может содержать ошибки, писал тут в редакторе, не проверял)
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Вместо подключения файла статистики (он наверняка где-то include'ится) - надо слать в него стату аяксом (фетчем)
HTML:
<script>$.getJSON("https://api.ipify.org?format=json", function(data) {
        $("#gfg").html(data.ip);
        fetch('log.php/?ip='+data.ip)
            .then(()=>{console.log('Данные переданы')});
})</script>
(если есть jQ, можете переписать на ajax от jQ)
log.php - это ваш файл "основная часть"

А функцию получения IP модернизировать
PHP:
function getRealIpAddr() {
    if( !empty($_GET['ip']) ){
        $ip= htmlentities($_GET['ip']);
    } elseif (!empty($_SERVER['HTTP_CLIENT_IP']))
(код может содержать ошибки, писал тут в редакторе, не проверял)

Да, файл статистики подключался через <?php include("stat.php"); ?>

Теперь значит на все нужные страницы добавляем скрипт:
Код:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script>$.getJSON("https://api.ipify.org?format=json", function(data) {
        $("#gfg").html(data.ip);
        fetch('in1.php/?ip='+data.ip)
            .then(()=>{console.log('Данные переданы')});
})</script>

А основная часть теперь такая:
PHP:
<?php
$file="stat.log";    // файл для записи истории посещения сайта
$col_zap=4999;    // ограничиваем количество строк log-файла

function getRealIpAddr() {
    if( !empty($_GET['ip']) ){
        $ip= htmlentities($_GET['ip']);
    } elseif (!empty($_SERVER['HTTP_CLIENT_IP']));
    }

if (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) {$bot='YandexBot';} //Выявляем поисковых ботов
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) {$bot='Googlebot';}
else { $bot=$_SERVER['HTTP_USER_AGENT']; }

$ip = getRealIpAddr();
$date = date("H:i:s d.m.Y");        // определяем дату и время события
$home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];    // определяем страницу сайта
$lines = file($file);
while(count($lines) > $col_zap) array_shift($lines);
$lines[] = $date."|".$bot."|".$ip."|".$home."|\r\n";
file_put_contents($file, $lines);
?>

Но пока не пишет ничего в лог...
Если загрузить страницу, нажать (f12) и перейти по ссылке http://test.com/stranica?ip=888.888.88.888 то запишет:
Код:
02:02:09 22.02.2024 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | Тут должен быть ip | test.com/stranica?ip=888.888.88.888 |
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
В консоли (f12) пишет это:
Код:
Failed to load resource: net::ERR_NAME_NOT_RESOLVED
in:1 Mixed Content: The page at 'https://test.com/stranica' was loaded over HTTPS, but requested an insecure resource 'http://test.com/stranica?ip=888.888.88.888'. This request has been blocked; the content must be served over HTTPS.
in:5 Uncaught (in promise) TypeError: Failed to fetch
    at Object.success (in:5:9)
    at i (jquery.min.js:2:28017)
    at Object.fireWith [as resolveWith] (jquery.min.js:2:28783)
    at A (jquery.min.js:4:14035)
    at XMLHttpRequest.<anonymous> (jquery.min.js:4:16323)
Почему-то ругается на отсутствие ssl, хотя он есть...
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
> А основная часть теперь такая:

Нет, я там написал вставку, что надо вставить в похожее место
1708626818229.png


> В консоли (f12) пишет это:
Используются разные протоколы у вас http и https. Вы уверены, что смогли привязать SSL на тестовый локальный домен?

И/или неправильное название файл - выше вы указываете in1.php, а запрос почему-то стучится на stranica.
Если у вас файл лежит в корне, то пропишите fetch('/in1.php/?ip='+data.ip)

Также обращаю внимание, что строка $("#gfg").html(data.ip); скорее всего вам не нужна, она выводит IP где-то на странице.
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
> А основная часть теперь такая:

Нет, я там написал вставку, что надо вставить в похожее место
Посмотреть вложение 3360

> В консоли (f12) пишет это:
Используются разные протоколы у вас http и https. Вы уверены, что смогли привязать SSL на тестовый локальный домен?

И/или неправильное название файл - выше вы указываете in1.php, а запрос почему-то стучится на stranica.
Если у вас файл лежит в корне, то пропишите fetch('/in1.php/?ip='+data.ip)

Также обращаю внимание, что строка $("#gfg").html(data.ip); скорее всего вам не нужна, она выводит IP где-то на странице.
В общем хорошие новости... Теперь так:
Подключаем статистику через скрипт...
Код:
нужно было добавить эту строчку, чтоб браузер не ругался на SSL.
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script>$.getJSON("https://api.ipify.org?format=json", function(data) {
        fetch('stat1.php/?ip='+data.ip)
            .then(()=>{console.log('Данные переданы')});
})</script>


stat1.php (основная часть)
Код:
<?php
$file="stat.log";    // файл для записи истории посещения сайта
$col_zap=4999;    // ограничиваем количество строк log-файла

function getRealIpAddr() {
    if( !empty($_GET['ip']) ){
        $ip= htmlentities($_GET['ip']);
    } elseif (!empty($_SERVER['HTTP_CLIENT_IP']))        // Определяем IP
  { $ip=$_SERVER['HTTP_CLIENT_IP']; }
  elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
  { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; }
  else { $ip=$_SERVER['REMOTE_ADDR']; }
  return $ip;
}

if (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) {$bot='YandexBot';} //Выявляем поисковых ботов
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) {$bot='Googlebot';}
else { $bot=$_SERVER['HTTP_USER_AGENT']; }

$ip = getRealIpAddr();
$date = date("H:i:s d.m.Y");        // определяем дату и время события
$home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];    // определяем страницу сайта
$lines = file($file);
while(count($lines) > $col_zap) array_shift($lines);
$lines[] = $date."|".$bot."|".$ip."|".$home."|\r\n";
file_put_contents($file, $lines);
?>


stat2.php (просмотр статистики)
Код:
<?php
if (isset($_GET[col])) { $col=$_GET[col]; } else { $col=20; }
$file=file("stat.log"); ?>

<html>
<head>
<style type='text/css'>
td.zz {PADDING-LEFT: 3px; FONT-SIZE: 9pt; PADDING-TOP: 2px; FONT-FAMILY: Arial; COLOR: Black;}
</style>
</head>

<body>
<center>
<?php
if ($col>sizeof($file)) { $col=sizeof($file); }
echo "Последние <b>".$col."</b> посещений сайта:"; ?>

<table id="myTable" width="auto" cellspacing="1" cellpadding="1" border="0"
    STYLE="table-layout:fixed">

  <tr bgcolor="#ADD8E6">
<td onclick="sortTable(0)" class="zz" width="auto"><b>Время и дата</b></td>
<td onclick="sortTable(1)" class="zz" width="450"><b>Данные о посетителе</b></td>
<td onclick="sortTable(2)" class="zz" width="auto"><b>IP/прокси</b></td>
<td onclick="sortTable(3)" class="zz" width="auto"><b>Посещенный URL</b></td>
</tr>

<?php
   for ($si=sizeof($file)-1; $si+1>sizeof($file)-$col; $si--) {
   $string=explode("|",$file[$si]);
   $q1[$si]=$string[0]; // дата и время
   $q2[$si]=$string[1]; // имя бота
   $q3[$si]=$string[2]; // ip бота
   $q4[$si]=$string[3]; // адрес посещения
echo '<tr bgcolor="#B0E0E6"><td class="zz">'.$q1[$si].'</td>';
echo '<td class="zz">'.$q2[$si].'</td>';
echo '<td class="zz">'.$q3[$si].'</td>';
echo '<td class="zz">'.$q4[$si].'</td></tr>';
}
echo '<br>Просмотреть последние <a href=?col=20>20</a> | <a href=?col=50>50</a>';
echo '<br>Просмотреть <a href=?col='.sizeof($file).'>все посещения</a>.</center>';
?>
</table></center></body></html>


В лог пишет теперь так: (здесь я так понимаю уже нельзя убрать этот "?ip=888.888.88.888" хвост в конце посещенного URL? чтоб было просто "test.com/stranica")
Код:
22:21:07 22.02.2024 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 | 888.888.88.888 |  test.com/stranica?ip=888.888.88.888 |

PS:
Код:
(in1.php) - это я на локальном сервере тестил скрипт и случайно скопировал не из того открытого файла...
 
Последнее редактирование:

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Можно переделать на POST запрос. но вам это будет сложнее.
Если вам надо ещё страницу передавать, то можно опрашивать referer
PHP:
$home = $_SERVER['HTTP_REFERER']];    // определяем страницу сайта
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
По идее можно даже положить скрипт в основную часть, просто убрав адрес php файла и также инклудить его на страницы)
Надо потестировать...
1708637859938.png
 
Последнее редактирование:

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Не совсем понял.
У вас будет по две строки записываться - одна при вызове страницы, как и раньше, другая после отсылки ajax.

Вообще на вашем месте я бы бросил этим маяться и подключил бы гугланалитику и/или яндексметрику.
Там всё это уже реализовано и есть море других возможностей.
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Не совсем понял.
У вас будет по две строки записываться - одна при вызове страницы, как и раньше, другая после отсылки ajax.

Вообще на вашем месте я бы бросил этим маяться и подключил бы гугланалитику и/или яндексметрику.
Там всё это уже реализовано и есть море других возможностей.
Да, я уже понял, что по 2 строки (ip клауда + строка ip с ajax)
Но в целом ваш вариант с подключением заработал... Пока на нем остановлюсь...
1708692092132.png
 
Последнее редактирование:

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Добавил возможность сортировки полей в stat2.php
JavaScript:
<script>
function sortTable(n) {
  var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
  table = document.getElementById("myTable");
  switching = true;
  //Set the sorting direction to ascending:
  dir = "asc";
  /*Make a loop that will continue until
  no switching has been done:*/
  while (switching) {
    //start by saying: no switching is done:
    switching = false;
    rows = table.getElementsByTagName("TR");
    /*Loop through all table rows (except the
    first, which contains table headers):*/
    for (i = 1; i < (rows.length - 1); i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*Get the two elements you want to compare,
      one from current row and one from the next:*/
      x = rows[i].getElementsByTagName("TD")[n];
      y = rows[i + 1].getElementsByTagName("TD")[n];
      /*check if the two rows should switch place,
      based on the direction, asc or desc:*/
      if (dir == "asc") {
        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
          //if so, mark as a switch and break the loop:
          shouldSwitch= true;
          break;
        }
      } else if (dir == "desc") {
        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
          //if so, mark as a switch and break the loop:
          shouldSwitch = true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      /*If a switch has been marked, make the switch
      and mark that a switch has been done:*/
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      //Each time a switch is done, increase this count by 1:
      switchcount ++;     
    } else {
      /*If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again.*/
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}
</script>
 

Grasss

Active Member
Регистрация
02.11.2017
Сообщения
40
Не совсем понял.
У вас будет по две строки записываться - одна при вызове страницы, как и раньше, другая после отсылки ajax.

Вообще на вашем месте я бы бросил этим маяться и подключил бы гугланалитику и/или яндексметрику.
Там всё это уже реализовано и есть море других возможностей.
Спасибо Вам за помощь со скриптом)
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Вы думали что у вас будет, когда будет тысячи строк?
Читайте про PHP пагинацию и именно для больших больших файлов.
 
Верх Низ