форум vBSupport.ru > vBulletin > vBulletin 3.8.x > Вопросы по vBulletin 3.8
  • »
VBsupport перешел с домена .ORG на родной .RU Ура! Пожалуйста, обновите свои закладки - VBsupport.ru
 
 
 
 
tays
Эксперт
 
tays's Avatar
Default Исправление ошибки 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'];
            }
        } 
Здесь предыдущее решение проблемы, которое работает не всегда. Его можно откатить и не применять
Attached Files
File Type: php fix_attach.php (1.9 KB, 25 views)

Last edited by tays : 08-15-2018 at 02:12 PM. Reason: Новая редакция фикса
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
 
 
Luvilla
Гость
Default

Quote:
Originally Posted by eska View Post
Проблема скорее всего имеет место и в более ранних версиях VB3.
имеет
но ошибки стали сыпаться после обновления майсиквела (не помню, в какой именно момент)
я как раз почему-то надеялась (непонятно, с какого перепугу, наивная), что в 3.8.8 разрабы учли, что обновляется не только PHP, но и MySQL
не учли... печально...
 
 
syn
Эксперт
vBSNews
 
syn's Avatar
Default
0

Quote:
Originally Posted by Luvilla View Post
после обновления майсиквела
это что за зверюшка неведомая?
 
 
tays
Эксперт
 
tays's Avatar
Default
1

Quote:
Originally Posted by Luvilla View Post
но ошибки стали сыпаться после обновления майсиквела (не помню, в какой именно момент)
С версии 5.5
Quote:
Originally Posted by Luvilla View Post
я как раз почему-то надеялась (непонятно, с какого перепугу, наивная), что в 3.8.8 разрабы учли, что обновляется не только PHP, но и MySQL
не учли... печально...
Там логическая ошибка в программном коде VB, которая, строго говоря, не зависит от версии БД.
Просто раньше это прокатывало в БД, теперь перестало, нужно описанное исправление.
Quote:
Originally Posted by syn View Post
это что за зверюшка неведомая?
Не то сын, не то дочь...
Это MySQL.
Кстати, My - это имя дочери отца-основателя этой БД - Майкл Монти Видениус (Michael Widenius).
А еще у него есть дочка Maria, в честь которой названа MariaDB

Last edited by tays : 05-03-2015 at 07:04 PM.
 
 
Scandal
Простоузер
Default
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
Эксперт
 
tays's Avatar
Default
1

Quote:
Originally Posted by Scandal View Post
Any idea?
Заменил фикс в шапке темы.
@hoo, в 3.8.12 я бы тоже это добавил т.к. фикс полезный.
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 03:13 PM.


Powered by vBulletin® Version 4.x.fuck
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Loading...