Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Boris

Глюк при переголосовании

Рекомендованные сообщения

В поиске не нашёл ничего. Может не так искал...

 

Излагаю суть косяка.

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

Показывая результаты опроса, пишется что 18 пользователей проголосовало

Суммируя голоса всех опций голосования - получается 22 голоса.

Копнув таблицу ibf_voters, увидел что 4 юзера удалили свой голос и проголосовали заново.

Однако их первичный голос не удалился.

И получается, что окончательный результат голосования искажён.

 

Что делать???? Кроме как лишать опции удалять голос.

 

 

З.Ы. Версия 3.3.4

Поделиться сообщением


Ссылка на сообщение

Каким образом вы сумируете голоса, если для каждого варианта показывается сколько было отдано для него голосов? Если один пользователь проголосовал в одном вопросе за один вариант, а в другом за другой, то в сумме - у вас будут 2 голоса - 2 пользователя? Количество голосов не показывает количество проголосовавших . При удаления голоса запись в бд удаляется, при повторном голосовании запись добавляется. Если там две записи одного пользователя к одному опросу, то встает вопрос, почему он смог проголосовать второй раз если запись уже имеется?

Если вы считаете что у вас глюк - приведите конкретные примеры и подробно на них обоснуйте почему именно это глюк.

Поделиться сообщением


Ссылка на сообщение

В данной теме ТОЛЬКО ОДИН вопрос для голосования.

Я суммирую голоса, которые есть в результатах голосования. То есть, на данный момент проголосовало 24 пользователя.

Вариант1 - 8 голосов

Вариант2 - 6 голосов

Вариант3 - 5 голосов

Вариант4 - 9 голосов

Получается 28.

 

При удаления голоса запись удаляется, при повторном голосовании запись добавляется.

 

Я тоже думал что так и должно быть, но наткнулся на вот что:

Вот так выглядит запись в таблице ibf_voters в колонке member_choices у пользователя, который проголосовал один раз и больше не дёргался:

a:1:{i:1;a:1:{i:0;s:1:"3";}} - проголосовал за третью опцию в опросе

a:1:{i:1;a:1:{i:0;s:1:"2";}} - а вот тут за вторую

 

А вот так выглядит эта запись у тех, кто менял своё мнение:

a:1:{i:1;a:2:{i:0;s:1:"2";i:1;s:1:"3";}} - сначала за вариант 2, а потом за вариант 3

a:1:{i:1;a:2:{i:0;s:1:"1";i:1;s:1:"4";}} - сначала за вариант 1, потом за вариант 4

 

Таких записей ровно 4. Столько же сколько и разница между 28 и 24.

Поделиться сообщением


Ссылка на сообщение

Попробовал сейчас поиграться: проголосовать, удалить, проголосовать опять...

Всё это время мониторил что есть в таблице ibf_voters

Всё происходило правильно и при удалении голоса запись данного юзера пропадала. А при голосовании заново не формировалась более удлинённая запись как в четырёх случаях.

Вывод (промежуточный) - разница получается не из за переголосования.

 

Из за чего тогда???

Повторяю, в топике один опрос с одним вопросом с возможностью выбрать только один вариант

Поделиться сообщением


Ссылка на сообщение

А точно не стоит галочка "Позволить пользователям выбирать более одного варианта ответа"? При повторном голосовании запись удаляется целиком, а тут массив с двумя вариантами ответа, что может быть только в случае с выбором более одного ответа, или кто-то когда-то менял опции опроса. Я подтверждения такого бага в 3.3x не нашел. Хм.. но вообще-то там проверка на тип вопроса нету, так что если школохацкеры захотят могут подменить тип полей и отправить ответ с мультивыбором для вопроса с единственным выбором. Тут одно из двух, ибо запись при отмене удаляется и она физически не может участвовать в повторном голосовании.

Поделиться сообщением


Ссылка на сообщение

а ларчик просто открывался :)

Так и есть. Мой косяк. Можно было выбирать более одного ответа. Но этим воспользовались только 4 человека.

Прошу прощение за беспокойство.

Поделиться сообщением


Ссылка на сообщение

Ну и проверка от особо шустрых пользователей, которые могут подменить запрос.

 

/admin/applications/forums/modules_public/extras/vote.php

 

		if ( count( $vote_cast ) < count( $poll_answers ) )
		{
			$this->registry->output->showError( 'topic_vote_not_enough', 10355 );
		}

Добавить ниже

 

		//-----------------------------------------
		// Check multi vote poll
		//-----------------------------------------

		foreach( $vote_cast as $question_id => $choice_array )
		{
			$answers = $poll_answers[ $question_id ];

			if( isset( $answers ) AND ! $answers['multi'] )
			{
				if( count( $choice_array ) > 1 )
				{
					$vote_cast[ $question_id ] = array( current( $choice_array ) );
				}
			}
		}

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...