[Ошибка] Редактированное сообщение

Список разделов phpBBex 1.x (поддерживается) Поддержка 1.x

Описание: У вас проблемы с phpBBex 1.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #1 InTheWeb » 12.10.2016, 13:27

Приветствую.
На локалке тестирую phpBBex 1.9.1 и заметил, что переодически при редактировании сообщения вместо моего ника выводится "Гость". Однако если viewtopic.php заменить на стандартный phpBB 3.0.14, то подобного не наблюдается.
Повторное редактирование помогает.

В чём может быть проблема?

Добавлено спустя 1 час 9 минут:
Код: Выделить всё
[phpBB Debug] PHP Notice: in file [ROOT]/viewtopic.php on line 1649: Undefined offset: 81
[phpBB Debug] PHP Notice: in file [ROOT]/viewtopic.php on line 1649: Undefined offset: 81
* 81 = ID пользователя
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #2 Sumanai » 12.10.2016, 15:34

InTheWeb:В чём может быть проблема?
Кто знает?
InTheWeb:PHP Notice: in file [ROOT]/viewtopic.php on line 1649: Undefined offset: 81
Это на файле от phpBBex или от phpBB?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #3 InTheWeb » 12.10.2016, 15:48

Sumanai:Это на файле от phpBBex или от phpBB?
Это на файле от phpBBex.
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #4 Sumanai » 12.10.2016, 15:55

В оригинальном файле на этой строке комментарий, который никак не может вызывать ошибки. Приложите свой файл.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #5 InTheWeb » 12.10.2016, 15:59

Держите.
Вложения
viewtopic.rar
viewtopic.пхп
(18.48 КБ) Скачиваний: 382
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #6 Sumanai » 12.10.2016, 16:08

Что-то мне кажется, что это из-за Admin Only Edit Post MOD. Либо Topic Moderator MOD.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #7 InTheWeb » 12.10.2016, 16:08

Sumanai:Topic Moderator MOD.
Крайне вряд ли. Всегда работал.
Sumanai:Admin Only Edit Post MOD
Попробую удалить. Отпишусь.
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #8 InTheWeb » 13.10.2016, 10:43

Нет, к сожалению, проблема не пропала.
Ещё заметил такую особенность: если проредактировать на этой странице ещё несколько постов, то ник становится корректным и ошибка пропадает.
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #9 InTheWeb » 15.10.2016, 11:24

Код: Выделить всё
// If reversed order is used for storing
if ($store_reverse)
{
   $post_list = array_reverse($post_list);
}
Закомментировал данный код и всё отлично. Что это вообще?

Я понимаю, что возвращение в обратном порядке. Но к чему?
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #10 Sumanai » 15.10.2016, 11:34

Это чтобы не перегружать БД, чтобы выбирать 20 сообщений с конца, а не выбирать тысячи сообщений сначала лишь для того, чтобы их отбросить. Оптимизация. Сейчас посмотрю, как это может быть связано с редактированием сообщений.

Добавлено спустя 7 минут 4 секунды:
InTheWeb, первое сообщение в проблемной теме было закреплено?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #11 InTheWeb » 15.10.2016, 11:42

Sumanai:InTheWeb, первое сообщение в проблемной теме было закреплено?
Нет, такого не было.

Добавлено спустя 27 секунд:
Причем, если я заменяю все на стандартный viewtopic.php из phpBB, то всё ОК.
Теперь заметил, что сообщения наоборот выходят (в обратном порядке).
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #12 Sumanai » 15.10.2016, 12:29

InTheWeb:Теперь заметил, что сообщения наоборот выходят (в обратном порядке).
InTheWeb:Закомментировал данный код
Очевидно, нужно его вернуть.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #13 InTheWeb » 15.10.2016, 12:34

Sumanai:Очевидно, нужно его вернуть.
Одно убивает другое. оО
Кстати, я так понимаю, попытки найти связь с редактированием провалились?
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #14 Sumanai » 15.10.2016, 13:13

Пока не выяснил. Была надежда на закреплённый первый пост, но она провалилась, думаю дальше.

Добавлено спустя 15 минут 11 секунд:
InTheWeb, проведите такой тест: Замените строку
Код: Выделить всё
            $display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']);
На строки
Код: Выделить всё
            $display_username = get_username_string('full', $row['post_edit_user'],
$post_edit_list[$row['post_edit_user']]['username'],
$post_edit_list[$row['post_edit_user']]['user_colour']);
После воспроизведите ошибку и посмотрите, какая из этих трёх строк будет выдавать ошибку Undefined offset.

Добавлено спустя 2 минуты 51 секунду:
Так же интересно было бы узнать, проявляется ли ошибка на
  1. последней странице темы
  2. в первой половине темы
  3. во второй половине темы
  4. везде.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #15 InTheWeb » 16.10.2016, 12:15

Sumanai, доброе утро.
Собственно, что успел выявить... Ошибки на следующих строках:
Код: Выделить всё
$post_edit_list[$row['post_edit_user']]['username'],
$post_edit_list[$row['post_edit_user']]['user_colour']);
Sumanai:Так же интересно было бы узнать, проявляется ли ошибка на
последней странице темы
в первой половине темы
во второй половине темы
везде.
Не смог полностью уследить, но, как правило, где-то внизу происходит. Например, в этот раз на 19 посту такое произошло.

Добавлено спустя 3 часа 35 минут:
Таким образом все работает:
Спойлер
Код: Выделить всё
$sql = 'SELECT p.post_id
   FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': '') . "
   WHERE p.topic_id = $topic_id
      " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . "
      " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . "
      $limit_posts_time
   ORDER BY $sql_sort_order";
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);

$i = ($store_reverse) ? $sql_limit - 1 : 0;
while ($row = $db->sql_fetchrow($result))
{
   $post_list[$i] = (int) $row['post_id'];
   ($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);

while ($row = $db->sql_fetchrow($result))
{
   if ($topic_data['topic_first_post_show'] && $row['post_id'] == $topic_data['topic_first_post_id'])
   {
      // Skip first post if it is pinned
      continue;
   }
   $post_list[] = (int) $row['post_id'];
}
$db->sql_freeresult($result);


// Show first post on every page if needed
if ($topic_data['topic_first_post_show'])
{
   array_unshift($post_list, (int) $topic_data['topic_first_post_id']);
}

if (!sizeof($post_list))
{
   if ($sort_days)
   {
      trigger_error('NO_POSTS_TIME_FRAME');
   }
   else
   {
      trigger_error('NO_TOPIC');
   }
}
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #16 InTheWeb » 17.10.2016, 13:23

Проблема снова имеет место быть.
Нарыл такое: /viewtopic.php?t=1661
Может, пора уже исправить как-нибудь?

Добавлено спустя 23 минуты 48 секунд:
Такой кусок вроде исправляет ситуацию:
Код: Выделить всё
if($topic_data['topic_first_post_show'] && ( $start != 0))
{
   $i = 0;
   $post_list[$i] = $topic_data['topic_first_post_id'] ;
   $i = ($store_reverse) ? $sql_limit : $i+1;
}
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #17 Sumanai » 17.10.2016, 15:42

InTheWeb:Может, пора уже исправить как-нибудь?
Пора конечно. В следующей версии, которая скоро выйдет, думаю это исправить.
Просто я никак не могу повторить ошибки.
InTheWeb:Такой кусок вроде исправляет ситуацию:
Не то, костыль какой-то, кусок кода совершенно не в тему.
Сейчас я совершенствую понимание относящегося к проблеме кода и разрабатываю нормальное исправление.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #18 InTheWeb » 17.10.2016, 16:31

Sumanai:разрабатываю нормальное исправление.
я так понимаю, версия будет 2.0.*? :(
Получается, ошибку на моей версии уже никто исправлять не будет, очень жаль.
На 2.0 не перехожу из-за отсутсивя мода кураторов.

Добавлено спустя 1 минуту 31 секунду:
Sumanai:Сейчас я совершенствую понимание относящегося к проблеме кода и разрабатываю нормальное исправление.
Не дочитал. То есть, исправление будет и в моде, и в письменном виде? Отлично. Благодарю.
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

Сообщение #19 Sumanai » 17.10.2016, 16:49

InTheWeb:я так понимаю, версия будет 2.0.*? :(
Да.
InTheWeb:Получается, ошибку на моей версии
А какая у вас? Я так и не понял, вы то ищите мод на 2.0, то вот сейчас.
InTheWeb:На 2.0 не перехожу из-за отсутсивя мода кураторов.
Вам же указали на соответствующее расширение, названия у них разные, но суть одна.

Добавлено спустя 24 секунды:
InTheWeb:То есть, исправление будет и в моде, и в письменном виде?
Все правки выложены в открытый доступ в репозитории. Я дам вам ссылку.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #20 InTheWeb » 17.10.2016, 16:50

У меня 1.9. Вы, видимо, случайно перенесли тему в этот раздел вместе с предыдущей моей (она, кстати, именно по 2.0)
Такой код 100% убирает ошибку. Взял у автора << first post on every page >>
Спойлер
Код: Выделить всё
// Container for user details, only process once
$post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = array();
$has_attachments = $display_notice = false;
$bbcode_bitfield = '';
$i = $i_total = 0;

// Go ahead and pull all data for this topic
$sql = 'SELECT p.post_id
   FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': '') . "
   WHERE p.topic_id = $topic_id
      " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . "
      " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . "
      $limit_posts_time
   ORDER BY $sql_sort_order";
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);

$i = ($store_reverse) ? $sql_limit - 1 : 0;
// First post on every page
// Show first post on every page if needed
if ($topic_data['topic_first_post_show'] && ($start != 0))
{
   if (!$store_reverse)
   {
      $post_list[$i] = $topic_data['topic_first_post_id'];
   }
   $i++;
}

while ($row = $db->sql_fetchrow($result))
{
   $post_list[$i] = (int) $row['post_id'];
   ($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);

// For the case the user is trying to reach the second half of the topic
if ($topic_data['topic_first_post_show'] && ($start != 0) && $store_reverse)
{
   $post_list[$i] = $topic_data['topic_first_post_id'];
}

if (!sizeof($post_list))
{
   if ($sort_days)
   {
      trigger_error('NO_POSTS_TIME_FRAME');
   }
   else
   {
      trigger_error('NO_TOPIC');
   }
}
-->> http://www.phpbbguru.net/community/viewtopic.php?p=252821#p252821

Добавлено спустя 41 секунду:
InTheWeb:Приветствую.
На локалке тестирую phpBBex 1.9.1
InTheWeb
Автор темы
Репутация: 16
С нами: 7 лет 8 месяцев

След.

Вернуться в Поддержка 1.x