Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Запрет повторного голосования

#mysql #база_данных #yii2


Здравствуйте. Сделал голосовалку и появилась необходимость запретить повторное голосование.
Решил через id пользователя. Для этого создал таблицу и в ней два поля user_id и poll_id.
То есть при заходе в голосование ищем в таблице все id текущего голосования, берем
id текущего пользователя и если есть совпадения - в данном голосовании уже был этот
пользователь, то запрещаем ему голосовать здесь, если id пользователя не совпадает
ни с одним id голосования, то даем ему проголосовать и записываем в таблицу id голосования
и id пользователя.
Скажите пожалуйста я правильно мыслю ? Или нагородил фигни ?
И эта таблица ведь должна быть связана с таблицами user и poll ?
    


Ответы

Ответ 1



Ваше решение правильное и адекватное. Добавьте уникальный составной ключ на таблицу (user_id, poll_id), тогда база данных и сама не допустит одинаковых записей в БД и следовательно нескольких голосов одного пользователя по одному голосованию. Внешние ключи также желательно добавить на таблицы user и poll. Перед голосованием делайте запрос на данную таблицу по уникальному составному ключу и при наличии записи делайте запрет голосования, также данную выбранную запись можно записывать в кеш, чтобы лишний раз не обращаться к таблице. Возможно, но не обязательно, для дополнительной информации добавить туда дату и время, когда пользователь проголосовал, здесь будет видна статистика голосований, а в будущем Вы сможете добавить различный функционал, связанный с ограничением голосования по времени или количеству голосов за определенный интервал.

Ответ 2



Вроде получилось, вот код контроллера: public function actionPoll($id, $user_id, $poll_id) { $single = Poll::getOne($id); $getdata = PollUser::getData($user_id, $poll_id); $u = Yii::$app->user->id; if ($u != $getdata->user_id && $id != $getdata->poll_id) { if ($single->load(Yii::$app->request->post())) { if ($single->count1) { $single->updateCounters(['count1' => 1]); } if ($single->count2) { $single->updateCounters(['count2' => 1]); } if ($single->count3) { $single->updateCounters(['count3' => 1]); } Yii::$app->db->createCommand("INSERT INTO poll_user (user_id, poll_id) VALUES ($u, $id)")->execute(); return $this->redirect("/site/poll/?id=$single->id&user_id=$u&poll_id=$single->id"); } } else { return $this->render('pollonlyresult', ['single' => $single, 'getdata' => $getdata]); } return $this->render('poll', ['single' => $single, 'getdata' => $getdata]); } Берем голосование. Берем данные из проверочной таблицы. Получаем id залогиненого юзера - проверяем на совпадения в проверочной таблице - если нет совпадений, то голосуем и записываем текущего юзера и голосование в таблицу. Редиректим на страницу с результатами. Если же есть совпадения, то сразу редиректим на страницу с результатами. Вроде бы так, большое спасибо всем кто ответил.

Комментариев нет:

Отправить комментарий