VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
Исправление ошибки vbulletin со счетчиком вложений в удаленных темах
7
Иногда при удалении тем и сообщений в vbulletin могут возникать ошибки базы данных вида:
Code:
Database error in vBulletin 3.8.8:
Invalid SQL:
UPDATE thread
SET attach = attach -
CASE
WHEN threadid = 39268 THEN 149
ELSE 0
END
WHERE threadid IN (-1,39268);
MySQL Error : BIGINT UNSIGNED value is out of range in '(`mybase`.`thread`.`attach` - (case when (`mybase`.`thread`.`threadid` = 39268) then 149 else 0 end))'
Error Number : 1690
Проблема связана со спецификой физического удаления/не удаления вложений в vbulletin в зависимости от прав пользователя или модератора, который удаляет сообщение или тему. Проявляться проблема может в разных ситуациях, но самый простой способ воспроизведения проблемы такой:
Пользователь создает сообщение с вложением. Затем пользователю что-то не нравится и он удаляет свое сообщение (или это делает модератор). Общий счетчик вложений в теме при этом уменьшается, однако само вложение не удаляется, если у пользователя (или модератора) нет прав физического удаления сообщений.
Если модератор или администратор с правами физического удаления сообщений попробует после этого удалить тему (не имеет значения как - soft или hard) с этим удаленным сообщением, то увидит эту ошибку.
Причина - при удалении темы будут удаляться все вложения, включая и то вложение, которое находится в удаленном пользователем сообщении.
При удалении того самого вложения общий счетчик вложений в теме снова будет уменьшен, что и приведет к отрицательному значению.
Исправить данную логику vbulletin может быть довольно затратно, поэтому лучше сделать фикс, который безопасно избавит от появления подобной ошибки.
У этой проблемы есть два решения - быстрое и правильное
Быстрое решение: у поля attach в таблице thread убрать атрибут UNSIGNED.
Правильное решение:
Внести исправление в файл includes/class_dm_attachment.php, которое предотвратит появление запросов к БД, ведущих к отрицательному значению счетчика вложений в теме:
В районе строки 446 (номер строки может различаться в разных версиях)
заменить код:
PHP Code:
foreach($this->lists['threadlist'] AS $threadid => $count) { $threadidlist .= ",$threadid"; $threadcasesql .= " WHEN threadid = $threadid THEN $count"; }
на
PHP Code:
foreach($this->lists['threadlist'] AS $threadid => $count) { $thread_info = $this->registry->db->query_first("SELECT attach FROM " . TABLE_PREFIX . "thread WHERE threadid=" . $threadid); $threadidlist .= ",$threadid"; if ($thread_info['attach'] >= $count) { $threadcasesql .= " WHEN threadid = $threadid THEN $count"; } else { $threadcasesql .= " WHEN threadid = $threadid THEN " . $thread_info['attach']; } }
1) Предотвратить появление проблемы в будущем - исправить ошибку в коде vb.
Найти в includes/functions_databuild.php в функции delete_thread такой код в районе строки 1048:
PHP Code:
if (!$delinfo['keepattachments']) { $threadman->set('attach', 0); }
и заменить его на вот такой:
PHP Code:
if (!$delinfo['keepattachments'] AND can_moderate($threadinfo['forumid'], 'canremoveposts')) { $threadman->set('attach', 0); }
2) Исправить в базе данных последствия ошибки, описанной в п.1.
Для этого нужно скопировать приложенный файл fix_attach.php в папку форума и запустить его в браузере (типа http://мойсайт/forum/fix_attach.php).
Скрипт проверяет удаленные темы и корректирует в них счетчик вложений, если в этом есть необходимость.
Применение скрипта абсолютно безопасно, но сначала можно просто провериться: поставить $fix = 0; в коде скрипта.
Если скрипт в этом режиме выдаст id-ы тем, то можно попробовать их открыть (http://мойсайт/forum/showthread.php?t=найденный_id) и hard-удалить. При попытке удаление должна появиться описанная ошибка БД.
Для лечения делаем $fix = 1 и запускаем скрипт еще раз. Примечание: если у вас есть префикс у таблиц, то пропишите его в переменную $tableprefix.
Last edited by tays : 08-15-2018 at 02:12 PM.
Reason: Новая редакция фикса
Проблема скорее всего имеет место и в более ранних версиях VB3.
имеет
но ошибки стали сыпаться после обновления майсиквела (не помню, в какой именно момент)
я как раз почему-то надеялась (непонятно, с какого перепугу, наивная), что в 3.8.8 разрабы учли, что обновляется не только PHP, но и MySQL
не учли... печально...
syn
Эксперт
Join Date: Dec 2008
Location: Харьков, Украина
Награды в конкурсах:
Posts: 1,096
Версия vB: 3.8.x
Пол:
Reputation:
Professional 885
Репутация в разделе: 327
0
Quote:
Originally Posted by Luvilla
после обновления майсиквела
это что за зверюшка неведомая?
@tays
Эксперт
Join Date: Jun 2006
Posts: 374
Версия vB: 3.8.x
Пол:
Reputation:
Professional 1079
Репутация в разделе: 761
1
Quote:
Originally Posted by Luvilla
но ошибки стали сыпаться после обновления майсиквела (не помню, в какой именно момент)
С версии 5.5
Quote:
Originally Posted by Luvilla
я как раз почему-то надеялась (непонятно, с какого перепугу, наивная), что в 3.8.8 разрабы учли, что обновляется не только PHP, но и MySQL
не учли... печально...
Там логическая ошибка в программном коде VB, которая, строго говоря, не зависит от версии БД.
Просто раньше это прокатывало в БД, теперь перестало, нужно описанное исправление.
Quote:
Originally Posted by syn
это что за зверюшка неведомая?
Не то сын, не то дочь...
Это MySQL.
Кстати, My - это имя дочери отца-основателя этой БД - Майкл Монти Видениус (Michael Widenius).
А еще у него есть дочка Maria, в честь которой названа MariaDB
Last edited by tays : 05-03-2015 at 07:04 PM.
@Scandal
Простоузер
Join Date: Sep 2017
Posts: 1
Версия vB: 3.8.x
Reputation:
Novice 0
0
Hello all!
First of all sorry for English! I did found your site and this topic on google during the search for this issue which I have it also on my board.
We have a lots of forums with subforms (vB3.8.4) and ~ 3 million posts.
I'm trying to remove a header forum (so also all its subforums will be deleted) on Forum Manager > (dropdown menu for a forum) Delete Forum
The process is taking enough and suddenly this db error appears:
Quote:
Database error in vBulletin 3.8.4:
Invalid SQL:
UPDATE vb3_thread
SET attach = attach -
CASE
WHEN threadid = 161000 THEN 57
ELSE 0
END
WHERE threadid IN (-1,161000);
MySQL Error : BIGINT UNSIGNED value is out of range in '(`xxxxx`.`vb3_thread`.`attach` - (case when (`xxxxx`.`vb3_thread`.`threadid` = 161000) then 57 else 0 end))'
Error Number : 1690
Request Date : Friday, September 22nd 2017 @ 01:06:42 PM
Error Date : Friday, September 22nd 2017 @ 01:07:38 PM
Script : http://localhost/yyy/admincp/forum.php?do=kill
Referrer : http://localhost/yyy/admincp/forum.p...emove&f=190&s=
IP Address : ::1
Username : zzzz
Classname : vB_Database_MySQLi
MySQL Version : 10.1.19-MariaDB
It seems it is the same error that described on this topic.
I did the file edit and run the fix_attach.php (it returns "Работа завершена." --> "The work is completed."), then tried to delete again the forum, but I got again ~the same db error. :(
I noticed that during the process, some posts are deleted from "post" table, then the db error appears.
The forum is still there (I suppose for the reason that not all threads have been removed) and every time I run the "delete forum", the db error is different as have to do with the integer values (different "WHEN threadid = 161000 THEN 57" and "threadid IN (-1,161000)".
Any idea?
@tays
Эксперт
Join Date: Jun 2006
Posts: 374
Версия vB: 3.8.x
Пол:
Reputation:
Professional 1079
Репутация в разделе: 761
1
Quote:
Originally Posted by Scandal
Any idea?
Заменил фикс в шапке темы. @hoo, в 3.8.12 я бы тоже это добавил т.к. фикс полезный.