Разрешение только одного голоса на человека в системе голосования

Я работаю над небольшой системой постинга, чтобы я мог публиковать посты на своем сайте, и людям это нравилось и не нравилось.

Это выглядит так:

система голосования

На данный момент вы можете голосовать за и против столько раз, сколько захотите. Я знаю, как сделать изображения неактивными с помощью JavaScript, но мне также нужен способ сделать это на PHP, потому что кто-то может просто сделать кнопки снова активными с помощью fireBug или консоли Chrome.

Вероятно, это первое, что я делаю на PHP, так что я все еще новичок. Спасибо за любые предложения.


person Shawn31313    schedule 30.07.2012    source источник
comment
Определите, что такое человек? Как вы отличаете одного человека от другого?   -  person zerkms    schedule 31.07.2012
comment
Помимо хранения подсчета голосов, вам также необходимо хранить информацию о том, кто проголосовал. Затем, когда кнопка нажата, вы можете убедиться, что они уже проголосовали или еще не проголосовали.   -  person Matt    schedule 31.07.2012
comment
так вы думаете, что это работает с JS? что произойдет, если пользователь перезагрузит страницу?   -  person Karoly Horvath    schedule 31.07.2012
comment
Если вы разрешаете голосовать и тем, кто не является пользователем, то, боюсь, вам придется немало пострадать. Просто нет хорошего метода для решения такой сложности. Конечно, если бы у вас были четко определенные пользователи с записями в базах данных...   -  person Palladium    schedule 31.07.2012


Ответы (3)


Я не собираюсь просто писать для вас код, и, вероятно, на сайтах скриптов есть десятки работающих примеров. Вот несколько советов, которые направят вас в правильном направлении:

Переменные сеанса — $_SESSION[] — Проверяем, установлены ли они, а затем устанавливаем их после голосования. Пока они не закроют браузер, они не смогут снова проголосовать.

Файлы cookie - $_COOKIE[] - То же, что и сеанс, но могут оставаться, даже если они закрывают и снова открывают свой браузер.

IP-адрес — $_SERVER['REMOTE_ADDR'] — вести учет IP-адресов и голосов в таблице MySQL.

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

Допустима любая комбинация вышеперечисленного. Надеюсь, это направит вас в правильном направлении.

person Tim Withers    schedule 30.07.2012
comment
Спасибо, Тим, это также отвечает на вопрос, который я собирался задать об ограничении 1 голоса «нравится / не нравится» за размещенное изображение на моем веб-сайте. Но что касается файлов cookie, может ли кто-нибудь зарегистрировать второе голосование «Нравится/не нравится», если он очистит файлы cookie своего браузера? Как я могу постоянно хранить их голоса... должен ли я хранить их IP-адреса в базе данных? - person Growler; 21.11.2012
comment
@Growler Я бы определенно сохранил данные в базе данных MySQL, чтобы они не могли голосовать более одного раза, даже если они очищают свои данные. Однако использование мобильного устройства или прокси сведет на нет это, но ограничит их, возможно, полудюжиной голосов, если они действительно хотят тратить время и энергию на использование прокси. - person Tim Withers; 21.11.2012

Поскольку вы собираетесь это изучить, я не буду публиковать полный код. Зато могу дать обзор.

Лучший способ сделать это — сохранить голоса в таблице базы данных (вероятно, MySQL):

| vote_id | user_id | post_id | vote |

Где:

  • vote_id — это столбец с автоинкрементом, который создает уникальный идентификатор для каждого голоса.
  • user_id — это идентификатор пользователя, отправившего этот голос.
  • post_id — идентификатор поста, за который голосует пользователь
  • vote определяет, было ли это голосование за или против.

Теперь вы можете формировать запросы, чтобы определить, проголосовал ли кто-то за пост, и действовать соответствующим образом.

person nickb    schedule 30.07.2012
comment
Абсолютно правильно, но я не знаю, хорошо ли это, чтобы нарезать зубы с помощью PHP. - person Sablefoste; 31.07.2012
comment
Спасибо, но я получил систему голосования, мне просто нужен идентификатор пользователя, который мне помог. Но любой может голосовать, так что у меня нет членов. Что мне делать для части user_id? - person Shawn31313; 31.07.2012
comment
Просто мысль: если любому пользователю разрешено голосовать за сообщение только один раз, то не можете ли вы просто вырезать vote_id и вместо этого использовать user_id и post_id в качестве первичных внешних ключей? - person Palladium; 31.07.2012
comment
@Shawn - Вам нужен способ идентификации пользователей. Если у вас его нет, то абсолютно невозможно определить, голосовал ли человек за пост в прошлом. То, как вы реализуете это, зависит от того, что вы можете сделать так, чтобы люди входили в систему, вы можете основывать это на IP-адресе, IP-адресе и User-Agent или на чем угодно еще. - person nickb; 31.07.2012
comment
@Palladium - Вы могли бы, эта часть реализации в конечном итоге является личным предпочтением. Я всегда предпочитал иметь уникальные идентификаторы в таблице, а затем делать user_id, post_id индекс UNIQUE. Но такого рода детали казались слишком подробными для общего обзора. - person nickb; 31.07.2012
comment
Нет, я имею в виду, что у меня уже есть вся система. Все для того, чтобы люди не голосовали дважды. Я знаю, что мне нужно немного опознать, я не говорил, что ты этого не делаешь. Я хочу проверить по IP, но не совсем уверен, как проверить, есть ли уже IP в базе данных - person Shawn31313; 31.07.2012
comment
Вы должны сохранить IP-адрес пользователя в базе данных, а затем запросить базу данных, чтобы узнать, находится ли IP-адрес текущего пользователя в таблице голосов для определенного сообщения. Чтобы получить IP-адрес, см. in-php">этот ТАК вопрос. - person nickb; 31.07.2012
comment
Вы отправляете запрос и смотрите, возвращаются ли какие-либо результаты: SELECT * FROM votes WHERE post_id = 6 AND user_ip = '192.168.1.1' Если это возвращается с одной строкой, значит, пользователь проголосовал. Если нет, то пользователь не голосовал. - person nickb; 31.07.2012
comment
Man ur pro спасибо за такое предложение. Я изучаю создание базы данных для сайта социальной сети. Можете ли вы сказать мне, где я могу найти такие вещи, чтобы научиться моделировать данные веб-сайта. Спасибо. - person Arjun Chaudhary; 18.04.2015

Вам необходимо проверить его на стороне сервера, то есть в PHP-коде. Вы можете сделать это либо по IP-адресу (если пользователь/гость не вошел в систему), либо по имени пользователя (для зарегистрированного пользователя).

Вы не можете остановить пользователей с помощью проверки на стороне клиента.

person Kalpesh    schedule 30.07.2012
comment
Да, я знаю, это то, о чем я говорил, я хочу использовать PHP, а js будет немного для шоу. Но основной частью будет PHP. Как сохранить IP? - person Shawn31313; 31.07.2012
comment
КОГДА пользователь нажимает на ссылку, вы можете узнать IP-адрес пользователя по $_SERVER['REMOTE_ADDR'], который вам нужно сохранить в базе данных как отдельное поле. Поэтому в следующий раз, когда тот же пользователь снова попытается проголосовать, вы проверяете этот IP-адрес на соответствие с таблицей БД. - person Kalpesh; 31.07.2012