Как я могу сделать голосование с помощью файлов cookie проще, чем это?

Проще всего описать мою проблему на рабочем примере: даже если вы не вошли в систему, YouTube запоминает то, что вы смотрели, и в следующий раз дает вам предложения на основе ранее просмотренных фильмов.

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

Для каждого посетителя есть проверка, есть ли у него куки. Если да, я спрашиваю его голоса. Если нет, я создаю фиктивного пользователя и отправляю ему файлы cookie. Теперь я сохраняю временную метку этого пользователя «last_visit». После этого все одинаково для обоих пользователей. Моя проблема в том, что моя БД заполняется фиктивными пользователями, поэтому срок действия моих файлов cookie истекает через 3 месяца, а мой сайт регулярно проверяет, какие пользователи не посещали мой сайт за последние 3 месяца, и удаляет их из БД.

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

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

Что я здесь пропустил? Как это можно оптимизировать?


person ZTefter    schedule 17.02.2012    source источник


Ответы (1)


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

person dqhendricks    schedule 17.02.2012
comment
Я должен был упомянуть об этом: мой сайт дает предложения на основе голосов, например: кто проголосовал за это, также проголосовал за это, поэтому я каким-то образом связал голоса в БД. В настоящее время я использую для этого пользователей (чайников или реальных пользователей). - person ZTefter; 17.02.2012
comment
@ZTefter Понял. Немного хитрее. Вы все еще можете записать, кто за что проголосовал, с помощью случайного хэша или чего-то, что хранится в файле cookie. Просто прикрепите хэш к записям голосования, но не создавайте записи пользователей. - person dqhendricks; 17.02.2012
comment
Ок, спасибо, думаю, попробую. Но я все еще застрял в части создания файлов cookie. Голосование представляет собой AJAX-функцию javascript, которая вызывает PHP-файл с параметрами. Так что теоретически этот PHP должен создать файл cookie, это было бы лучше всего, но я не смог этого добиться. Это действительно возможно? Это правильный способ сделать это? - person ZTefter; 17.02.2012
comment
@ZTefter Если вы используете AJAX, вы, вероятно, захотите создать хеш и файл cookie с помощью javascript, а затем просто отправить информацию в PHP для сохранения. - person dqhendricks; 17.02.2012
comment
Я думал об этом, но не хотел делать видимым для всех, как генерируется мой хеш (поскольку код JS виден всем) — я счел это дырой в безопасности. Кроме того, когда я генерирую хеш, он должен быть уникальным (чтобы разделить голоса), поэтому мне нужно сделать вызовы БД, чтобы увидеть, есть ли такой же хэш, для которого нужен PHP. - person ZTefter; 17.02.2012
comment
@ZTefter Я не понимаю, как люди, знающие, как создается случайный хеш, могут повлиять на безопасность, единственная цель - однозначно идентифицировать анонимного пользователя. это не позволит получить доступ к какой-либо привилегированной информации. однако, если вы беспокоитесь, PHP сгенерирует хеш, вернет хэш в javascript, а затем javascript создаст файл cookie с хэшем. что касается выяснения того, есть ли уже дублирующиеся хэши в базе данных, следует предположить, что пользователь проголосовал ранее, поэтому я не уверен, как вы собираетесь это сделать, не создавая отдельную таблицу. - person dqhendricks; 17.02.2012
comment
@ZTefter, вы могли бы настроить таблицу исключительно для создания уникальных идентификаторов. у него будет только одно поле автоинкремента. если у пользователя еще нет идентификатора, вы получаете его из базы данных и используете его в своих файлах cookie/голосах. не требуется хеширование или генерация случайного идентификатора, но тогда вам нужно сделать дополнительный вызов БД. - person dqhendricks; 18.02.2012
comment
@ZTefter причина создания клиентской части cookie заключается в том, что создание PHP-стороны cookie не позволит javascript читать cookie до тех пор, пока не будет загружена новая страница. - person dqhendricks; 18.02.2012
comment
Спасибо за помощь, наконец-то я это сделал. Теперь он по-прежнему создает пользователей, но только когда происходит голосование - я нашел способ вызвать JS, который передает параметры в PHP, а затем этот PHP создает хеш, пользователя и отправляет файл cookie. - person ZTefter; 18.02.2012