Boris 2 15.11.2014 11:58 В поиске не нашёл ничего. Может не так искал... Излагаю суть косяка.Есть опрос, в котором можно выбрать только одну опцию ответа.Показывая результаты опроса, пишется что 18 пользователей проголосовалоСуммируя голоса всех опций голосования - получается 22 голоса.Копнув таблицу ibf_voters, увидел что 4 юзера удалили свой голос и проголосовали заново.Однако их первичный голос не удалился.И получается, что окончательный результат голосования искажён. Что делать???? Кроме как лишать опции удалять голос. З.Ы. Версия 3.3.4 Поделиться сообщением Ссылка на сообщение
siv1987 2 630 15.11.2014 14:55 Каким образом вы сумируете голоса, если для каждого варианта показывается сколько было отдано для него голосов? Если один пользователь проголосовал в одном вопросе за один вариант, а в другом за другой, то в сумме - у вас будут 2 голоса - 2 пользователя? Количество голосов не показывает количество проголосовавших . При удаления голоса запись в бд удаляется, при повторном голосовании запись добавляется. Если там две записи одного пользователя к одному опросу, то встает вопрос, почему он смог проголосовать второй раз если запись уже имеется?Если вы считаете что у вас глюк - приведите конкретные примеры и подробно на них обоснуйте почему именно это глюк. Поделиться сообщением Ссылка на сообщение
Boris 2 15.11.2014 15:14 В данной теме ТОЛЬКО ОДИН вопрос для голосования.Я суммирую голоса, которые есть в результатах голосования. То есть, на данный момент проголосовало 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, а потом за вариант 3a:1:{i:1;a:2:{i:0;s:1:"1";i:1;s:1:"4";}} - сначала за вариант 1, потом за вариант 4 Таких записей ровно 4. Столько же сколько и разница между 28 и 24. Поделиться сообщением Ссылка на сообщение
Boris 2 15.11.2014 15:38 Попробовал сейчас поиграться: проголосовать, удалить, проголосовать опять...Всё это время мониторил что есть в таблице ibf_votersВсё происходило правильно и при удалении голоса запись данного юзера пропадала. А при голосовании заново не формировалась более удлинённая запись как в четырёх случаях.Вывод (промежуточный) - разница получается не из за переголосования. Из за чего тогда???Повторяю, в топике один опрос с одним вопросом с возможностью выбрать только один вариант Поделиться сообщением Ссылка на сообщение
siv1987 2 630 15.11.2014 15:40 А точно не стоит галочка "Позволить пользователям выбирать более одного варианта ответа"? При повторном голосовании запись удаляется целиком, а тут массив с двумя вариантами ответа, что может быть только в случае с выбором более одного ответа, или кто-то когда-то менял опции опроса. Я подтверждения такого бага в 3.3x не нашел. Хм.. но вообще-то там проверка на тип вопроса нету, так что если школохацкеры захотят могут подменить тип полей и отправить ответ с мультивыбором для вопроса с единственным выбором. Тут одно из двух, ибо запись при отмене удаляется и она физически не может участвовать в повторном голосовании. Поделиться сообщением Ссылка на сообщение
Boris 2 15.11.2014 15:59 а ларчик просто открывался :)Так и есть. Мой косяк. Можно было выбирать более одного ответа. Но этим воспользовались только 4 человека.Прошу прощение за беспокойство. Поделиться сообщением Ссылка на сообщение
siv1987 2 630 15.11.2014 16:12 Ну и проверка от особо шустрых пользователей, которые могут подменить запрос. /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 ) ); } } } Поделиться сообщением Ссылка на сообщение