Quería realizar un seguimiento de los visitantes que van a mi sitio web. Cuando llega un visitante, quiero agregar a mi base de datos que ha habido un nuevo visitante y poder saber si regresa o es nuevo.
¿Sería mejor rastrearlos con una cookie o mediante una dirección IP? Habría una tabla llamada visitantes, que tendría el id_visitante y su dirección IP o código de cookie. Otra tabla llamada visitas, que rastrearía cada vez que un "visitante" llega al sitio, con id_visita, id_visitante y fecha/hora.
¿Cómo puedo identificar si se trata de una nueva visita o simplemente de otra página vista? es decir, cada página del sitio tendría este código que agregaría al visitante, pero no me gustaría que se registrara como una nueva visita cada vez que ven una página.
El otro pensamiento que tuve fue usar $_SERVER['HTTP_REFERER'], luego puedo decir que el visitante no está haciendo otra vista de página desde mi sitio, pero no estoy seguro de qué tan confiable es eso.
Así que me preguntaba ¿cómo podemos hacer esto?
La mejor manera es usar una combinación de dirección IP y COOKIES. Guardar solo la dirección IP no es suficiente porque puede cambiar con frecuencia cuando el usuario usa un proxy. Para cada carga de página, puede usar un código como este
// Get IP address of user function getUserIP() { if (!empty($_SERVER['HTTP_CLIENT_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; } // Check if cookie exists. If not then set new cookie. Return its value function getUserCookie() { if(isset($_COOKIE['visited'])) { // cookie is already set } else { list($usec, $sec) = explode(" ", microtime()); // Micro time! $expire = time()+60*60*24*30; // expiration after 30 day setcookie("visited", "".md5("".$sec.".".$usec."")."", $expire, "/", "", "0"); } return $_COOKIE['visited']; }Puede guardar ambos valores en el visitante de la tabla de la base de datos si no hay ningún visitante con estos valores y, por lo tanto, puede decir que es un nuevo visitante único. Si hay un visitante con uno de estos valores, entonces es un visitante que regresa, por lo que debe actualizar su tabla de visitas.
Pero creo que es mucho mejor tener una sola mesa ya que no conoces a tus visitantes. Con una sola consulta SQL, aún podrá distinguir visitantes únicos, páginas vistas, flujo de visitantes, tiempo de visita, etc.
Sugeriría usar una cookie persistente para almacenar información del visitante.
Cuando un visitante llega a su sitio, puede comprobar si ya tiene una cookie de id_visitante en su navegador:
De esta forma, puede realizar un seguimiento de los usuarios individuales identificando el navegador desde el que están visitando, ya que es más probable que sea estable que su IP o cualquier otra identificación anónima.
Nota: también puede hacerlo simplemente usando $_COOKIE de PHP sin AJAX, pero me resulta más cómodo separar completamente el código del lado del cliente del back-end. Es sólo una cuestión de preferencia personal.
if (haveVisitorCookie) { getVisitorDataByID(visitorCookie); //some ajax implementation } else { createVisitorCookie(); //save to back-end }La parte anterior solo cubre la identificación de visitantes nuevos/recurrentes y la información persistente del visitante. Para registrar lo que hace un usuario en una sola visita, la forma más fácil es usar las sesiones integradas de PHP .
Todo lo que necesita hacer es llamar a session_start() al comienzo de su código y a su visitante se le asigna una sesión que permanecerá abierta hasta que el visitante permanezca en cualquier página de su sitio. Luego puede agregar datos a la sesión actual con la variable mágica $_SESSION . Puede almacenar cualquier dato en él en forma de $_SESSION['key'] = value .
Por ejemplo, puede consultar el ID de la sesión actual en cada carga de página y, si ya existe, agregarle la acción actual; de lo contrario, guárdelo como una nueva visita del mismo visitante.
session_start(); if ($visitorID) { //visitorID is sent from your front-end and contains the cookie data $previousSession = getLastVisitorSession($visitorID); $currentSession = session_id(); if ($previousSession) { if ($previousSession === $currentSession) { // New pageview on same session } else { // New session ... saveNewVisitorSession($visitorID, $currentSession) } } }Puntos de bonificación: incluso puede ayudar a sus usuarios a continuar desde donde lo dejaron cargando su última sesión en caso de que no tengan una ID de sesión actual pero tengan una ID de visitante con una sesión anterior almacenada
¡Espero que esto ayude!
Lo siento de antemano, no es realmente el más bonito de todos los códigos :) Pero supongo que esto podría ser más o menos.
<?php //Step over if cookie is if (!isset($_COOKIE["SITE_VISITED"])) { already set setcookie('SITE_VISITED', 'X'); $db = mysqli_connect('localhost', 'bfu', '1234', 'visits'); //Do we already have a record in the DB? $res = mysqli_query($db, sprintf("SELECT * FROM visits WHERE ipaddr='%s';",$_SERVER['REMOTE_ADDR'])); if ($res === FALSE && $res->num_rows = 0) { //Record in DB not found, let's create one $res2 = mysqli_query($db, sprintf("INSERT INTO visits('ipaddr','page') VALUES ('%s','%s');",$_SERVER['REMOTE_ADDR'],$_SERVER['REQUEST_URI'])); } mysqli_close($res); } ?>