Защитить встречные взгляды, чтобы не манипулировать - PullRequest
0 голосов
/ 09 января 2011

У меня есть этот код:

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

, но когда я нажимаю «Обновить» снова и снова, счетчик увеличивается с каждым обновлением.

Как я могу защитить этот счетчик от сеансов или любым другим способом?

Ответы [ 4 ]

1 голос
/ 09 января 2011

Вы можете установить переменную сеанса с помощью (hasBeenCounting), и если она установлена, вы не увеличиваете.

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

EDIT:

session_start():

должен быть в самом верху любой страницы, на которой вы собираетесь использовать сеансы.

0 голосов
/ 09 января 2011
$id = $_GET['id'];

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

Я изменил код, и теперь он работает.

0 голосов
/ 09 января 2011

Я думаю, что сессии с куки-файлами - ваш лучший шанс. Возможно, вы захотите установить cookie после первого посещения, а затем, если cookie уже установлены, вы не обновляете счетчик просмотров.

Синтаксис будет похож на это:

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

Вот как я бы это реализовал:

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'");
}
0 голосов
/ 09 января 2011

Один из способов сделать это - использовать сеансы.Однако, в конце концов, это не совсем масштабируемо.Когда пользователь перемещается по вашему сайту, у вас может появиться массивный файл сеанса.Кроме того, каждый раз, когда пользователь создает новый сеанс, вы все равно будете записывать это представление.

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

 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
)

Каждый раз, когда пользователь просматривает ветку, вам нужно будет проверить эту таблицу.Если в thread_views нет записи, вставьте ее и увеличьте столбец views в таблице threads.Если в thread_views есть строка, то вы знаете, что пользователь уже просмотрел ветку.

...