Proteger las vistas del mostrador para no ser manipulado

Tengo este codigo:

$id = $_GET['id'];
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");

pero cuando hago clic en actualizar una y otra vez, el contador aumenta con cada actualización.

¿Cómo puedo proteger este contador de esto con sesiones o de cualquier otra forma?

preguntado el 09 de enero de 11 a las 00:01

¿Quiere decir que solo quiere contar las visitas únicas? -

Sí, esto es lo que quiero decir. -

4 Respuestas

Puede establecer una variable de sesión con (hasBeenCounted) y, si se establece, no incrementa.

if(!isset($_SESSION['hasBeenCounted'])
{
    $id = $_GET['id'];
    mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
    $_SESSION['hasBeenCounted'] = "counted";
}

EDIT:

session_start():

deberá estar en la parte superior de cualquier página en la que desee utilizar sesiones.

Respondido el 09 de enero de 11 a las 03:01

+1 simple, limpio. Puede que necesite utilizar session_start() antes de jugar con $_SESSION de lo contrario, obtendrá un error. - Mike B

Entiendo por qué puede haberlo omitido ... llamarlo dos veces también arrojará un error: p - Mike B

Esta solución no es correcta porque funcionará en todos los subprocesos, por ejemplo, abrí title1 y luego actualicé este hilo, el contador no aumentará, pero cuando abro otro subproceso title2, por ejemplo, este thead no aumentará también porque la sesión se configuró desde el primer thead, ¿cómo se puede vincular la sesión al ID del hilo? - Hinchar

Su servidor no tiene ningún concepto del ID de hilo del sistema. ¿Por qué importaría que varios subprocesos del mismo sistema estén unidos de esa manera? - Stefan H

Una forma de hacer esto es usar sesiones. Sin embargo, al final, eso no es realmente escalable. A medida que un usuario se mueve por su sitio, podría tener un archivo de sesión masivo. Además, cada vez que un usuario crea una nueva sesión, registrará esa vista de todos modos.

Si solo desea registrar una vista única para un solo usuario, debe almacenar que ese usuario vio el hilo. Dependiendo de si su sitio solo permite que los usuarios registrados vean hilos, o si su sitio está abierto al público, tendrá que almacenar algo único sobre cada usuario en una tabla separada, estructurada de esta manera (su kilometraje variará en tipos de campo):

 CREATE TABLE  `thread_views` (
`id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`thread_id` INT( 10 ) UNSIGNED NOT NULL ,
`user_id` INT( 10 ) UNSIGNED NOT NULL ,
`ts` TIMESTAMP NOT NULL
)

Cada vez que un usuario ve el hilo, deberá consultar esta tabla. Si no hay registro en thread_views, inserte uno, y el incremento de views columna en tu threads mesa. Si hay una fila en thread_views, entonces sabrá que el usuario ya ha visto el hilo.

Respondido el 09 de enero de 11 a las 03:01

Creo que las sesiones con cookies son tu mejor opción. Probablemente desee configurar la cookie después de la primera visita, y luego, si la cookie ya está configurada, no actualice su contador de visitas.

La sintaxis será similar a esta:

$expire=time()+2592000; //This is set to expire in 1 month (in seconds)
setcookie("visitor", "Already Visited", $expire);

Así es como lo implementaría:

if !(isset($_COOKIE["visitor"]))
{
   $expire=time()+2592000; //This is set to expire in 1 month (in seconds)
   setcookie("visitor", "Already Visited", $expire);
   $id = $_GET['id'];
   mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
}

Respondido el 09 de enero de 11 a las 03:01

$id = $_GET['id'];

if(!isset($_SESSION['hasBeenCounted']) || $_SESSION['hasBeenCounted'] != $id)
  {
  mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
  $_SESSION['hasBeenCounted'] = $id;
  }

Modifiqué el código y ahora funciona.

Respondido el 09 de enero de 11 a las 09:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.