Как вставить страницу, откуда она пришла на мой сайт и id издателя?

Мне нужно иметь возможность зарегистрировать идентификатор издателя в записи справочных данных.

site.com/url-of-post/?publishers=1435356P

Код для получения исходного URL-адреса, откуда он пришел на мой сайт, не работает

$refferer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

Мой полный код:

Посетители_connections.php

<?php
$ServerName = "localhost";
$Username = "root";
$PassWord = "";
$DataBase = "visitor_publishers";

$con = new mysqli($ServerName, $Username, $PassWord, $DataBase);
if ($con->connect_error) {
  exit("Error de conexión: " . $con->connect_error);
}
if (!$con->set_charset("utf8")) {
  printf("Error cargando el conjunto de caracteres utf8: %s\n", $con->error);
  exit();
}

function getBrowserType($user_agent){
  if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) return 'Opera';
  elseif (strpos($user_agent, 'Edge')) return 'Edge';
  elseif (strpos($user_agent, 'Chrome')) return 'Chrome';
  elseif (strpos($user_agent, 'Safari')) return 'Safari';
  elseif (strpos($user_agent, 'Firefox')) return 'Firefox';
  elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) return 'Internet Explorer';
  return 'Other';
}

//https://stackoverflow.com/questions/6717926/function-to-get-user-ip-address
//https://stackoverflow.com/questions/1634782/what-is-the-most-accurate-way-to-retrieve-a-users-correct-ip-address-in-php/2031935#2031935
//https://stackoverflow.com/questions/13646690/how-to-get-real-ip-from-visitor
//http://itman.in/en/how-to-get-client-ip-address-in-php/
function GetIP(){
  foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
    if (array_key_exists($key, $_SERVER) === true){
      foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip){
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
          return $ip;
        }
      }
    }
  }
}

//https://stackoverflow.com/questions/12369615/serverhttp-referer-missing
$refferer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

function selfURL() {
$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
$protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
}
function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }
?>

visitor_tracking.php

<?php
require_once('visitors_connections.php');

$visitor_ip = GetIP();
$visitor_browser = getBrowserType($_SERVER['HTTP_USER_AGENT']);
$visitor_date = date("Y-m-d H:i:s");
$visitor_refferer = $refferer;
$visited_page = selfURL();
//$id_publishers = "";    

$stmt = $con->prepare("INSERT INTO visitors_table (visitor_ip, visitor_browser, visitor_date,
 visitor_refferer, visitor_page) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("sssss", $visitor_ip,$visitor_browser,$visitor_date,$visitor_refferer,$visited_page);
$stmt->execute();
?>

Записи таблицы:

introducir la descripción de la imagen aquí

Еще одна небольшая ошибка проверки, нет контроля для регистрации посещений, например, чтобы избежать регистрации того же ip в следующий раз. Тот же ip перерегистрировать, но через 48 ч.

Попробуйте использовать $ _GET ['publishers'], чтобы получить прибыль

user3782114 10.08.2018 15:54
publishers=1435356P является частью строки запроса и поэтому должен быть доступен как параметр GET.
ADyson 10.08.2018 16:04

$_SERVER['HTTP_REFERER'] часто бывает пустым, потому что он зависит от браузера, и многие браузеры не устанавливают его из соображений конфиденциальности.

PeterM 10.08.2018 16:48

Хорошо. В вопросе, который вы сказали: «Мне нужно иметь возможность зарегистрировать идентификатор издателя» ... идентификатор издателя находится в параметре GET. Если вы уже знаете, как его получить, то в чем проблема? Возможно, я не понял твоего истинного значения.

ADyson 10.08.2018 16:59

Кстати, отдельный совет: Никогда заставьте ваше веб-приложение входить в базу данных как root. Root может делать все, что угодно, так что это потенциально может оставить вашу базу данных открытой книгой для хакеров. Вместо этого создайте отдельную учетную запись пользователя специально для этого приложения, у которого есть только разрешения, на самом деле потребности для правильной работы. Даже не делайте этого - это ярлык во время разработки или тестирования, потому что вам также необходимо проверить разрешения вашей учетной записи - в противном случае, когда вы начнете работать, у вас могут возникнуть непредвиденные ошибки, связанные с настройкой учетной записи пользователя.

ADyson 10.08.2018 17:01

Хорошо, я вижу. То, что вы подразумеваете под идентификатором, на самом деле было URL-адресом ссылающегося сайта. Что ж, как правильно сказал PeterM, это не под вашим контролем. Иногда он будет отправлен, иногда нет. Это совершенно необязательный параметр, который клиент, выполняющий HTTP-запрос, может выбрать, отправлять или не отправлять. Часто такие вещи, как прокси-серверы, также изменяют его, поэтому оно может отличаться от исходного значения. В спецификации даже не сказано, что в ней должно быть. Таким образом, вы можете попробовать записать его наверняка, но вы никогда не можете гарантировать, что он даст вам полное или даже правильное представление о ваших пользователях.

ADyson 10.08.2018 17:02

@ADyson, и небольшая проблема проверки заключается в том, что один и тот же IP-адрес регистрируется несколько раз, мне нужно иметь возможность передать условие, которое регистрируется только один раз каждые 48 часов. Как я могу пройти это условие? Не могли бы вы мне помочь пожалуйста :(

user10157540 10.08.2018 17:05

Повторная проверка IP-адресов - вам нужно сначала выбрать из таблицы посетителей, чтобы найти самую последнюю запись для этого IP-адреса. Если адрес существует, а время последнего посещения было менее 48 часов назад, не продолжайте вставку.

ADyson 10.08.2018 17:10

@ADyson Вы дали мне все альтернативы и решения в комментариях. Вы можете написать ответ, чтобы принять его :)

user10157540 10.08.2018 17:16

Я думал, вы хотите проверить по IP-адресу, а не по рефереру? Кстати, я полагаю, вы знаете, что IP-адрес не может быть уникальным для одного посетителя?

ADyson 10.08.2018 17:17

@ADyson Проверка по IP, давайте забудем эту справочную тему. Я вижу, что пользоваться им бесполезно.

user10157540 10.08.2018 17:20
0
11
57
1

Ответы 1

Проблема с HTTP_REFERRER в том, что иногда он отправляется, а иногда нет. Это совершенно необязательный параметр, который клиент, выполняющий HTTP-запрос, может выбрать, отправлять или не отправлять. Часто такие вещи, как прокси-серверы, также изменяют его, поэтому оно может отличаться от исходного значения. В спецификации даже не сказано, что в ней должно быть. Таким образом, вы можете попробовать записать его наверняка, но вы никогда не можете гарантировать, что он даст вам полное или даже правильное представление о ваших пользователях.

Повторная проверка IP-адресов - вам нужно сначала выбрать из таблицы посетителей, чтобы найти самую последнюю запись для этого IP-адреса. Если адрес существует, а время последнего посещения было менее 48 часов назад, не продолжайте вставку. Я был бы чем-то вроде SELECT visitor_ip FROM visitors_table ORDER BY visitor_date DESC LIMIT 1 - я не могу его протестировать, но это должно дать вам последнее посещение с этого IP-адреса. Если вы не получаете строк, этот IP-адрес никогда раньше не посещался

Каким будет завершение запроса?

user10157540 10.08.2018 17:21

извините, чтобы закончить что?

ADyson 10.08.2018 17:24

хе-хе нравятся мои абсурдные вопросы, помогите мне с вопросом, пожалуйста.

user10157540 10.08.2018 17:29

это не сложно. Что-то вроде SELECT visitor_ip FROM visitors_table ORDER BY visitor_date DESC LIMIT 1 - я не могу проверить это, но это должно дать вам последнее посещение этого IP-адреса. Если вы не получаете строк, этот IP-адрес никогда раньше не посещался.

ADyson 10.08.2018 17:30

Я понимаю об этом, но каково состояние 48 часов, и как он вставляет данные из $stmt = $con->prepare("INSERT INTO visitors_table (visitor_ip, visitor_browser, visitor_date, visitor_refferer, visitor_page) VALUES (?, ?, ?, ?, ?)"); $stmt->bind_param("sssss", $visitor_ip,$visitor_browser,$visitor_date,$visitor_refferer‌​,$visited_page); $stmt->execute();

user10157540 10.08.2018 17:50

"как он вставляет данные" ... что является вставка. Код, который я предлагаю, вам нужно будет написать перед ним. Чтобы проверить дату, используйте PHP для получения текущей даты, а затем сравните дату посещения из результата запроса с этим. Я не могу сказать, не можете ли вы разработать необходимые логические шаги, или вам просто нужно пойти и погуглить синтаксис для простых вещей, таких как запуск select. Вы также можете легко погуглить, как сравнивать даты с помощью PHP. Мне не нужно подробно описывать каждую крошечную часть, все это состоит из хорошо известных шагов, которые вы можете без труда исследовать.

ADyson 10.08.2018 17:52

@ADyson Привет, вы должны добавить в свой ответ то, что вы указали в комментарии. по крайней мере, так у них будет пример того, как это реализовать. +1

user9160552 10.08.2018 17:57

@ADyson Поскольку я понимаю, что SO мало что знает, я понимаю, потому что он взял отсюда каждый код, который можно увидеть по ссылкам, прокомментированным в вашем коде.

user9160552 10.08.2018 17:59

Другие вопросы по теме