Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Это просто крайне критично для меня, опросы очень большую роль играют. Помогите, пожалуйста.
Offline
@Джонни, проверяй чем отличаются файлы viewtopic.php и include/poll.php от файлов из сборки.
Смотри лог ошибок сервера.
Воспользуйся валидатором http://validator.w3.org/ и наведи порядок на сайте.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Poll.php я точно не трогал.
Offline
Замена viewtopic.php на тот, что из архива, эффекта не дала.
Offline
@Джонни, я выше написал, что надо сделать в первую очередь.
Достаточно потрогать viewtopic.php, чтобы сломать голосование.
Про лог ошибок говорю второй раз, ни какой реакции.
И убери со страниц форума криво вставленный блок который вызывает 26 ошибок при проверке валидности http://validator.w3.org/check?uri=http% … ne&group=0
+ вот это
Просто весь трафик на домен идёт через фильтр анти ДДоСа, поэтому у всех 1 адрес.
не имею понятие как может влиять на передачу данных, когда быстрая переадресация идет при отправке формы с голосованием.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Для проверки передачи данных в файле viewtopic.php строку
poll_vote($id, $pun_user['id']);
замени на строку
exit(var_export($_POST, true));
poll_vote($id, $pun_user['id']);
и покажи что выдаст при разных выборах вариантов голосования.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
array ( 'poll_max' => array ( 1 => '4', ), 'poll_vote' => array ( 1 => array ( 0 => '1', ), ), 'poll_type' => array ( 1 => '1', ), 'poll_ques' => '1', 'poll_csrf' => '6a3749e1661797f9213a5540a70783ef57f3c2e0', 'poll_submit' => 'Голосовать!', )
array ( 'poll_max' => array ( 1 => '4', ), 'poll_vote' => array ( 1 => array ( 0 => '2', ), ), 'poll_type' => array ( 1 => '1', ), 'poll_ques' => '1', 'poll_csrf' => '6a3749e1661797f9213a5540a70783ef57f3c2e0', 'poll_submit' => 'Голосовать!', )
Вот.
Это я выбрал первый и второй варианты.
Редактировался Джонни (2013-07-22 18:40:51)
Offline
@Джонни, данные поступают.
Теперь в файле include/poll.php измени функцию poll_vote на эту
function poll_vote($tid, $uid)
{
global $db;
if (poll_bad() || !poll_can_vote($tid, $uid)) poll_mess('Err1');
exit('1');
$csrf = poll_post('poll_csrf');
$ques = poll_post('poll_ques');
$type = poll_post('poll_type');
$votes = poll_post('poll_vote');
$amax = poll_post('poll_max');
exit('2');
if (is_null($csrf) || is_null($ques) || is_null($type) || is_null($votes) || is_null($amax)) poll_mess('Err2');
exit('3');
if (!is_array($type) || !is_array($votes) || !is_array($amax)) poll_mess('Err2');
exit('4');
$type = array_map('intval', $type);
$amax = array_map('intval', $amax);
$ques = intval($ques);
exit('5');
$csrf2 = pun_hash($tid.(pun_hash($uid.$ques.implode('0',$type))).get_remote_address().implode('.',$amax));
exit('6');
if ($csrf2 != $csrf) poll_mess('Err2');
exit('7');
$kol = 0;
foreach($votes as $k => $vote)
{
if ($k < 1 || $k > $ques) poll_mess('Err3');
$kol++;
$kk = 0;
$vote = array_map('intval', $vote);
foreach($vote as $i => $vo)
{
if ($type[$k] < 2 && $i != 0) poll_mess('Err2');
if ($type[$k] < 2 && $vo < 1) poll_mess('Err2');
if ($type[$k] < 2 && $vo > $amax[$k]) poll_mess('Err2');
if ($type[$k] > 1 && $i == 0) poll_mess('Err2');
if ($type[$k] > 1 && $i > $amax[$k]) poll_mess('Err2');
if ($type[$k] > 1 && $vo != 1) poll_mess('Err2');
$kk++;
}
if ($type[$k] < 2 && $kk != 1) poll_mess('Err4', $k);
if ($type[$k] > 1 && ($kk < 1 || $kk > $type[$k])) poll_mess('Err5', $k, $type[$k]);
}
if ($kol != $ques) poll_mess('Err6');
exit('8');
$arr = array();
foreach($votes as $k => $vote)
{
$vote = array_map('intval', $vote);
foreach($vote as $i => $vo)
{
if ($type[$k] < 2) $j = $vo;
else $j = $i;
$arr[] = '(question='.$k.' AND field='.$j.')';
}
}
exit('9');
if (!empty($arr))
$db->query('UPDATE '.$db->prefix.'poll SET votes=votes+1 WHERE tid='.$tid.' AND ('.implode(' OR ', $arr).')') or error('Unable to update poll choice', __FILE__, __LINE__, $db->error());
exit('10');
$db->query('INSERT INTO '.$db->prefix.'poll_voted (tid, uid, rez) VALUES ('.$tid.','.$uid.',\''.$db->escape(serialize($votes)).'\')') or error('Unable to save vote', __FILE__, __LINE__, $db->error());
$db->query('UPDATE '.$db->prefix.'topics SET poll_kol=poll_kol+1 WHERE id='.$tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
exit('11');
poll_cache_delete($tid);
exit('12');
}
Голосуй первый раз, должно выдать 1. Удали код
exit('1');
.
Голосуй второй раз, должно выдать 2. Удали код
exit('2');
.
И т.д. пока все коды exit из функции не удалишь.
На каком-то шаге возможно число не будет выдано, тогда перед ним вероятно ошибка возникает.
З.Ы. В файле viewtopic.php удали строчку
exit(var_export($_POST, true));
чтобы вызов функции при голосовании проходил.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Джонни, база данных какая используется?
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
MySQL.
Offline
@Джонни, InnoDB используется?
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Попробовал удалить блоки описания и объявления, но результата всё равно нет. Опрос не работает.
Хотя стоп... А может это быть из-за этого, что голосуют все с одного IP?
Редактировался Джонни (2013-07-22 19:09:56)
Offline
А может это быть из-за этого, что голосуют все с одного IP?
Нет.
@Джонни, InnoDB используется в базе?
UP
Что в config.php в строке $db_type = ... написано?
Редактировался Visman (2013-07-22 19:21:26)
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
$db_type = 'mysqli_innodb';
Offline
Сделай бэкап базы и поставь вместо
$db_type = 'mysqli_innodb';
это
$db_type = 'mysqli';
Потом попробуй проголосовать.
З.Ы. Была у кого-то проблема в InnoDB, но у меня и на локальном компе и на тестовом форуме работает все нормально.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Но по-моему у меня опросы работали нормально. Сейчас попробую.
Offline
Заработало.
Никаких больше косяков не вылезет из-за смены типа БД?
Offline
@Джонни, косяков не должно быть.
А вот почему опросы с InnoDB перестали работать не понятно. Тряси админов, чего они в настройках сервера меняли.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Там хостинг идиотский. Буду менять.
Огромное спасибо!
Offline
могу предположить, что дело в транзакциях. innodb версия характерна как раз транзакциями.
движок устроен так, что выдает commit только один раз -- в конце работы, но если была ошибка MySQL (какбы некритичная для работы), то коммит не пройдет целиком. на то она и транзакция!
дай бог памяти, есть в движке fluxbb место, связанное с небуферизованным query и попыткой заполнить какой-то кеш, то есть вызовается еще однин query пока предыдущий не завершен. эта ошибка не сопровождается die(), но это ошибка и она может сыграть злую шутку.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
@artoodetoo, у меня не воспроизводится ситуация с неработоспособностью innodb.
Как узнать в чем конкретно причина? Логи самого mysql могут что содержать при такой ситуации?
UP
А может транзакция как раз просто не закрывается?
Выход-то при голосовании идет через
header('Location: viewtopic.php?id='.$id.((isset($_GET['p']) && $_GET['p'] > 1) ? '&p='.intval($_GET['p']) : ''));
exit;
Редактировался Visman (2013-07-23 08:59:45)
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Джонни, проведи тест работоспособности опроса.
В файле viewtopic.php замени
if (!is_null(poll_post('poll_submit')))
{
poll_vote($id, $pun_user['id']);
header('Location: viewtopic.php?id='.$id.((isset($_GET['p']) && $_GET['p'] > 1) ? '&p='.intval($_GET['p']) : ''));
exit;
}
на это
if (!is_null(poll_post('poll_submit')))
{
poll_vote($id, $pun_user['id']);
// End the transaction
$db->end_transaction();
// Close the db connection (and free up any result data)
$db->close();
header('Location: viewtopic.php?id='.$id.((isset($_GET['p']) && $_GET['p'] > 1) ? '&p='.intval($_GET['p']) : ''));
exit;
}
и включи mysqli_innodb в конфиге.
После этого создай опрос и проверь голосование в нем.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Сделаю. А подскажите, пожалуйста, можно ли запретить пользователям использовать gif-анимации в качестве аватар? Непонятно почему, но при прокрутке страниц, если у пользователя в подписи или на аватаре есть гиф, ощущаются лаги.
Offline
@Джонни, это проблемы браузеров, а не форума.
По умолчанию на форуме разрешены аватары размером 150х150 точек и 10кБайт объемом. Если уж в 10кБайт пихать анимацию, то картинка будет совсем мелкая.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
А может транзакция как раз просто не закрывается?
Выход-то при голосовании идет черезheader('Location: viewtopic.php?id='.$id.((isset($_GET['p']) && $_GET['p'] > 1) ? '&p='.intval($_GET['p']) : '')); exit;
Я бы предложил такие места заменить на вызов redirect(). Тогда завершение будет штатным.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline