Я создаю галерею изображений и хочу, чтобы у меня была кнопка голосования, чтобы люди могли нажимать, чтобы увеличить количество голосов, полученных за изображение. Очевидно, что я не хочу, чтобы люди рассылали спам по кнопке голосования, поэтому я хочу ограничить каждого пользователя 1 голосом.
У меня нет доступа к какой-либо базе данных (кроме записи в файлы), и система входа в систему не подходит для моей целевой аудитории.
Каков наилучший способ сохранить, посетил ли пользователь страницу раньше? Было бы лучше использовать PHP или JavaScript или что-то еще для этого?
Без системы аутентификации вы можете временно ограничить действия пользователя, но пользователь может обмануть вашу систему, чтобы проголосовать несколько раз.
Вот решения, не использующие систему входа / авторизации (и их недостатки):
Вы можете сохранить действие upvote на стороне клиента с файлами cookie, localalstorage или любым другим способом, но пользователь может отменить все это, чтобы восстановить право голоса снова. Для большинства людей это может быть хорошо (зависит от вашей аудитории), но любой хитрый парень, желающий обмануть систему, сможет это сделать.
Вы можете сохранить действие обновления на стороне сервера с помощью ссылки, такой как пользовательский агент или IP-адрес. Но эти системы «аутентификации» ненадежны: пользователь может использовать один и тот же пользовательский агент и легко их менять. Несколько пользователей могут использовать один и тот же IP-адрес и использовать прокси для изменения своего IP-адреса.
Третье решение — использовать внешнюю систему: систему голосования facebook +1 (Facebook использует собственную систему авторизации) или google + или другие внешние сервисы. Пользователь не сможет обмануть систему, но у вас нет подсчета голосов на вашей стороне, и кто-то без учетной записи Facebook или Google + не сможет голосовать.
Лично я пойду и найду себе базу данных … но если вы не хотите ее использовать, вы все равно можете записать в файл. Например: создать массив и сохранить в нем IP-адрес пользователя. Затем записать этот массив в виде кода JSON в файл (json_encode) и сохранить его. Когда пользователь нажимает кнопку «Мне нравится», читайте файл, декодируйте json (json_decode) и проверяйте, существует ли IP-адрес в файле. Если нет: добавить в массив и сохранить в файл. Количество лайков равно количеству IP-адресов в объекте JSON.
Лучший способ реализовать это — сделать ajax-вызов при нажатии кнопки «Мне нравится». Чем посетитель не увидит загрузку страницы.
Примечание: Технически вы можете установить cookie, чтобы «запомнить», что пользователь уже нажал кнопку. Это сэкономит вам некоторое чтение файла, в котором хранятся лайки.