phpBB 3.0.11 & PostgreSQL

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Yukh
phpBB 1.4.4
Сообщения: 153
Стаж: 14 лет 3 месяца
Откуда: Москва
Благодарил (а): 16 раз
Поблагодарили: 10 раз

phpBB 3.0.11 & PostgreSQL

Сообщение Yukh »

Сегодня в логе postgres наткнулся на такие ошибки:

Код: Выделить всё

ERROR:  duplicate key value violates unique constraint "phpbb_topics_posted_pkey"
DETAIL:  Key (user_id, topic_id)=(955, 15155) already exists.
STATEMENT:  INSERT INTO phpbb_topics_posted  (user_id, topic_id, topic_posted) VALUES (955, 15155, 1)
ERROR:  duplicate key value violates unique constraint "phpbb_topics_posted_pkey"
DETAIL:  Key (user_id, topic_id)=(20572, 52154) already exists.
STATEMENT:  INSERT INTO phpbb_topics_posted  (user_id, topic_id, topic_posted) VALUES (20572, 52154, 1)
И так при каждом новом сообщении на форуме.

Порылся в гугле - проблема известная с 2010 года, но решения ее так и нет.
В результате немного допилил сам.

Файл includes/functions.php:

Код: Выделить всё

FIND (строка 1519):
$sql_ary = array(                                                                                         
'user_id' => (int) $use_user_id,                                                    
'topic_id' => (int) $topic_id,                                                       
'topic_posted' => 1                                                                              
);                                                                                                        
                                                                                                                                  
$db->sql_query('INSERT INTO ' . TOPICS_POSTED_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));    
$db->sql_return_on_error(false);

Код: Выделить всё

Добавить перед:
$sql = 'SELECT COUNT(*) AS num_records FROM ' . TOPICS_POSTED_TABLE . ' WHERE user_id='.(int) $use_user_id.' AND  topic_id='.(int) $topic_id;                                                                                                      
$result = $db->sql_query($sql);                                                                                 
$exists = (int) $db->sql_fetchfield('num_records');                                                             
$db->sql_freeresult($result);                                                                                   
                                                                                                                                  
if ($exists != 1) {

Код: Выделить всё

Добавить после: 
}
То есть, я добавил проверку наличия записи в таблице и делаю INSERT только в том случае, если запись отсутствует.

Вопрос - ничего я этим не нарушил?
Юрий.
Аватара пользователя
Pazh
Former team member
Сообщения: 2317
Стаж: 16 лет 10 месяцев
Благодарил (а): 42 раза
Поблагодарили: 506 раз

Re: phpBB 3.0.11 & PostgreSQL

Сообщение Pazh »

Проверьте права юзера, под которым заходите в базу на возможность делать TRUNCATE TABLE и DELETE FROM. Дублирование возникает из-за не выполнения запроса на очистку таблицы
Помощь в ЛС/email только за WM или ЮMoney
Аватара пользователя
Yukh
phpBB 1.4.4
Сообщения: 153
Стаж: 14 лет 3 месяца
Откуда: Москва
Благодарил (а): 16 раз
Поблагодарили: 10 раз

Re: phpBB 3.0.11 & PostgreSQL

Сообщение Yukh »

Код: Выделить всё

# psql -h ps.hostname -U username database
Password for user username: 
psql (9.1.2)
Type "help" for help.

database=>  
database=> truncate phpbb_topics_posted ;
TRUNCATE TABLE
database=> delete from phpbb_topics_posted  where user_id=20600 and topic_id=59699;
DELETE 1
С правами все в порядке.
Юрий.

Вернуться в «Поддержка phpBB 3.0.х»